General Discussion
Good Story from Paul Murray in todays West Australian Page 33 titled " A FISHY CAMPAIGN"
Submitted by Howard George on Sat, 2011-10-15 16:43Makes good reading for those people who are interested in the SW Commonwealth Marine Park and the comments from WA'S rich and famous citzens who began fashioning a political harpoon aimed at everyone who enjoys eating local seafood. WA fisheries Minister Norman Moore decided to take on the pressure group last week. in a letter addressed to Mr Clough, the business head of a family that made it's fortune riding WA's resources boom he points out that the latest State of the Fisheries report found there was no unacceptable risk to fish stocks in WA. The final statement is something to behold which I wish to share is that people with more money that scientific sense want to help Canberra change the seafood eating habits of nearly two million people for no justifiable reason . West Australians should not let it happen.
- 1 comment
- 1978 reads
Boston Whaler Outrage and Exmouth Marina Village
Submitted by Ray White Exmouth on Sat, 2011-10-15 12:20
As part of the Mandurah Boat Show promotional activities the developer of the Exmouth Marina Village is offering a fantastic prize pack to the next 10 purchasers of any developer stock in the Exmouth Marina Village.
1 out of the first 10 purchasers will go into the draw to win a $133,000 Boston Whaler 220 Outrage. All of the 10 purchaser get to select a $5000+ prize pack as well, click here for details http://www.raywhiteexmouth.ca.com.au/weblinks/1in10chancetowin.pdf
This is an awesome offer given that you could win this just by purchasing a block from as low as $189,000 or a House and Land Package from as low as $479,000.
This competition just started yesterday and we already have one entrant. Give me a call or send me an email if you would like more information.
Mark Lucas
Mob: 0439 494 481
Email: mark@raywhiteexmouth.com
- 1 comment
- 2549 reads
weed report
Submitted by Iceman on Sat, 2011-10-15 11:01If you are thinkig of beach fishing tonight do not bother. The ocean is covered in thick weed so expect it to be on the beach tonight with the seabreeze.
- 6 comments
- 1940 reads
Anyone NOR going to the Boat Show? Need Help
Submitted by alfred on Sat, 2011-10-15 10:21Hi Folks
I need to pass something small to Ian from Flying Fisherman. Can any one help?
Alfred
04 111 67 441
- 3 comments
- 1782 reads
fatal error coming up whilst posting
Submitted by snappermiles on Sat, 2011-10-15 08:33hey guys i have been trying to post a few pictures and every time i try it comes up with
Fatal error: Allowed memory size of 83886080 bytes exhausted (tried to allocate 17280 bytes) in /home/fishwrec/public_html/includes/image.gd.inc on line 190
can anyone tell me what is going wrong?? i have posted pictures lately and havent had a problem untill last night and this morning!
cheers jeff
/////////// SEARCH ///////////
var g_aEng;
var g_loc;
// 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.needLivePhishCheck = false;
searchshield.allowedSites = [];
searchshield.enabled = function (doc)
{
var result = searchshield.avgCallFunc(doc, 'GetSearchEnabled');
return (result == '1' ? 1 : 0);
};
searchshield.init = function (doc)
{
if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))
return;
if (!searchshield.enabled(doc))
return;
if (!g_aEng)
g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href);
if (!g_aEng)
return;
// init search object (not declared or is null)
if (typeof xplSearch === 'undefined')
{
// global
xplSearch = new searchshield.Search();
// reset the links added flag
xplSearch.new_links = false;
xplSearch.doc = doc;
xplSearch.href = xplSearch.doc.location.href;
xplSearch.uri = searchshield.parseLink(xplSearch.href);
xplSearch.engine = new searchshield[g_aEng+'SearchEngine'](xplSearch)
xplSearch.addEngine(xplSearch.engine);
searchshield.launch(doc);
}
if (doc.location.href != g_loc)
{
g_loc = doc.location.href;
if ((typeof xplSearch !== 'undefined') && (xplSearch != null))
searchshield.launch(doc);
}
};
searchshield.launch = function (doc)
{
// IE specific check
searchshield.quirksMode = (self.top.document.compatMode == 'BackCompat');
searchshield.docMode = parseInt(navigator.userAgent.split('MSIE')[1]);
if ((self === top) && (self.document === doc))
{
if (!xplSearch.engine)
return;
// set verdict display config
xplSearch.engine.setRatingsConfig(doc);
// init the alert popup
searchshield.initPopupAlert(doc);
if (xplSearch.engine.type != 'inline')
{
// save function reference for memory clean up later
var fn = function(event){avglsflyover.hide(null)};
//hide flyover if these events occur
window.detachEvent('onscroll', fn);
window.attachEvent('onscroll', fn);
doc.detachEvent('onkeydown', fn);
doc.attachEvent('onkeydown', fn);
}
// only start monitor on top doc
searchshield.avgPageMonitor.start(doc);
}
return;
};
// search monitors and processors - doc is always top most document
searchshield.avgPageMonitor = {
previousUrl: null,
start: function(doc){
searchshield.avgPageMonitor.stop();
searchshield.avgPageMonitor.process(doc);
searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000);
},
process: function(doc){
var currentUrl = doc.location.href;
var refresh = 0;
if (this.previousUrl != currentUrl) {
this.previousUrl = currentUrl;
avgreport.scanResult(doc, currentUrl);
refresh = (xplSearch.engine.name == 'google') ? 1 : 0;
}
searchshield.avgProcessSearch(doc, refresh);
},
stop: function(){
if (searchshield.avgPageMonitor.timeoutID)
{
window.clearTimeout(searchshield.avgPageMonitor.timeoutID);
delete searchshield.avgPageMonitor.timeoutID;
}
}
};
searchshield.avgProcessSearch = function (doc, refresh)
{
// doc may be about:Tabs or about:Blank
if (!doc)
return;
if (!searchshield.enabled(doc))
return;
if (!searchshield.clockUrl)
searchshield.clockUrl = searchshield.avgCallFunc(doc, 'GetIconUrl', '0');
xplSearch.clockUrl = searchshield.clockUrl
if (!xplSearch.engine)
return;
// get result links
xplSearch.links = [];
var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh);
searchshield.needLivePhishCheck = false;
for (var i=0; i < links.length; i++)
{
var isPhishing = searchshield.avglsCheckandUpdate(links[i]);
if (isPhishing)
searchshield.needLivePhishCheck = true;
}
if (searchshield.needLivePhishCheck)
{
var prev = '1';
if ( xplSearch.engine.type == 'inline' )
prev = '0';
searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);
searchshield.needLivePhishCheck = false;
}
else if (links.length > 0 && xplSearch.engine.type != 'inline')
{
searchshield.avgCallFunc(doc, 'FinalScanComplete');
}
// attach click handlers for popup alerts
doc.body.detachEvent("onclick", searchshield.blockClick);
doc.body.attachEvent("onclick", searchshield.blockClick);
doc.body.detachEvent("ondblclick", searchshield.blockClick);
doc.body.attachEvent("ondblclick", searchshield.blockClick);
};
searchshield.avgGetSearchLinks = function (doc, engine, refresh)
{
if (!doc.body)
return;
var alltags = doc.body.getElementsByTagName('a');
for (var i = 0; i < alltags.length; i++)
{
if ( !refresh )
{ // no checked test if refreshing - google
if (alltags[i].getAttribute('avglschecked'))
continue;
}
// ignore linked resources
if (alltags[i].tagName == 'LINK')
continue;
// ignore in-page bookmarks and javascript
if ((!alltags[i].href) ||
(alltags[i].href.charAt(0) == '#') || // in-page bookmark
(alltags[i].href.indexOf("javascript") == 0))
continue;
// ignore verdicts
if (/XPLSS_/.test(alltags[i].id))
continue;
// ignore flyover anchors
if (/linkscanner|avgthreatlabs|avg\.com/.test(alltags[i].href))
continue;
var href = engine.includeLink(alltags[i]);
if (!href)
continue;
var newNode = engine.search.addLink(alltags[i], href);
engine.addImage(newNode, engine.search.clockUrl, false);
}
// recursivesly process all frames
var docFrames = doc.frames;
if (docFrames && 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, 0);
}
}
return engine.search.links;
};
searchshield.avglsCheckandUpdate = function (linkNode)
{
if (!xplSearch)
return;
// element is the search result anchor
var element = linkNode.element;
var href = linkNode.href;
var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href);
if (result == null)
return;
var resultParse = result.split('::');
var phishing = resultParse[0]; // if phishing then rest of array does not exist.
if (phishing == 1)
return true;
if (resultParse.length < 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;
}
return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);
};
// click event handler - shows popup for links of caution and warning 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 <= searchshield.SCORE_SS_WARNING))
{
// prevent this click from going any further
var search_hash = searchshield.avgCallFunc(document, 'GetHash', document.location.href);
searchshield.ShowPopupAlert(document, link, img_id, search_hash);
// if possible, stop the event from going any further
searchshield.cancelEvent(event);
return false;
}
return true;
};
// called by native to update phishing links
searchshield.updatePhishingLinks = function (results)
{
if (!results)
return;
if (!xplSearch)
return;
var engine = xplSearch.engine;
var resultParse = results.split("::");
var resultsLength = resultParse[0];
for (var i=0; i < resultsLength; i++)
{
var idx = i*7;
var hash = resultParse[idx+1];
var score = resultParse[idx+2];
var new_image = resultParse[idx+3];
var alt_image = resultParse[idx+4];
var flyover = resultParse[idx+5];
var click_thru= resultParse[idx+6];
var altClick_thru = resultParse[idx+7];
engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);
}
};
searchshield.getAvgImage = function (element)
{
var obj = {};
obj.img = xplSearch.engine.getImgElement(element);
obj.score = -1;
//parse the score from the id
if (obj.img != null && obj.img.id)
{
var pos = !!obj.img.id ? obj.img.id.indexOf('U') + 1 : -1;
obj.score = (pos < 1) ? -1 : obj.img.id.charAt(pos);
obj.rawId = obj.img.id.substring(0,pos-1);
}
return obj;
};
searchshield.GetScannedLink = function (link)
{
if (!xplSearch || !(xplSearch.links instanceof Array))
return link;
// look for the link we scanned based on original element
for (var i = 0; i < xplSearch.links.length; i++)
{
if (xplSearch.links[i].element.href == link)
return xplSearch.links[i].href;
}
// else return the incoming link
return link;
};
searchshield.previouslyScanned = function (links, hash)
{
for (var i = 0; i < links.length; i++)
{
if ((links[i] != null) && (links[i].hash != null) &&
(links[i].hash == hash) && (links[i].checked == true))
return true;
}
return false;
};
searchshield.initPopupAlert = function (doc)
{
// check if it exists first
if (doc.getElementById("XPLSS_PopupAlert"))
return;
// create a div to use for the popup itself, hide for now
var popup_div = doc.createElement("DIV");
popup_div.setAttribute("id", "XPLSS_PopupAlert");
popup_div.style.position = "absolute";
popup_div.style.zIndex = "10000";
doc.body.appendChild(popup_div);
};
searchshield.initFlyover = function (doc, engine)
{
// create in top doc only
if (doc !== window.top.document)
doc = window.top.document;
// check if it exists first
if ((doc == null) || (doc.getElementById("XPLSS_Flyover")))
return;
// create a div to use for the flyover itself, hide for now
var flyover_div = doc.createElement("DIV");
flyover_div.setAttribute("id", "XPLSS_Flyover");
flyover_div.style.position = "absolute";
flyover_div.style.zIndex = "10000";
doc.body.appendChild(flyover_div);
// create a layer for the image
var trans_div = doc.createElement("DIV");
trans_div.setAttribute("id", "XPLSS_Trans");
trans_div.style.position = "absolute";
trans_div.style.zIndex = "9999";
doc.body.appendChild(trans_div);
};
searchshield.ShowPopupAlert = function (doc, link, hash, search)
{
// build the content
var popup_content = searchshield.avgCallFunc(doc, 'BuildPopupAlert', hash, search);
if (popup_content == null || popup_content == "")
return;
// get the div
var div = doc.getElementById("XPLSS_PopupAlert");
div.innerHTML = searchshield.CleanupHTML(popup_content);
// set position, account for scrolling
var zoom = searchshield.zoomLevel();
var pageOffsetX = Math.round(doc.documentElement.scrollLeft/zoom);
var pageOffsetY = Math.round(doc.documentElement.scrollTop/zoom);
div.style.left = 10 + pageOffsetX + "px";
div.style.top = 10 + pageOffsetY + "px";
// TODO: the event handler function doesn't exist so, is this even necessary?
//div.attachEvent("onmouseout", HidePopupAlert);
// set the link
//var data = doc.getElementById("avgalertpopurl");
//if (data)
// data.innerHTML = escape(link);
// set visibility
div.style.visibility = "visible";
//navigate to the link after timed delay
// TODO: Bug 31707 - make this open a new tab/window
setTimeout(function(){doc.location.assign(link)}, 3000);
};
searchshield.avgCallFunc = function (doc, name /*, param1..., paramN*/)
{
// get the data element
var avg_ls_data = (typeof gAvgDataElement !== 'undefined') ? gAvgDataElement : doc.getElementById("avglsdata");
if ((avg_ls_data == null) || (name == null))
return;
// save the data element
gAvgDataElement = avg_ls_data;
// for some reason you can't fire and event on an element with no parent node
if (avg_ls_data.parentNode == null)
return;
// set the attributes
avg_ls_data.setAttribute("function", name);
// set variable length of optional parameter attributes
var pcnt = 0;
for (var i=2; i < arguments.length; i++)
avg_ls_data.setAttribute("param"+(++pcnt), String(arguments[i]));
avg_ls_data.fireEvent("onrowenter");
// get the result
return avg_ls_data.getAttribute("result");
};
// general use functions - begin
// DOM Functions
searchshield.getAnchorNode = function (node, filterFunc)
{
// filterFunc should return a boolean
if (!filterFunc || !filterFunc instanceof Function)
return null;
// go up the dom tree starting at node and look for anchor
// before hitting a header, div or table element
while ((node != null) &&
(node.tagName != null) &&
(node.tagName != "A"))
{
if (filterFunc(node))
{
node = null;
break;
}
node = node.parentNode;
}
return node;
};
searchshield.getDocuments = function (frame, frameArray)
{ // recursively get all embedded frames/docs
frameArray.push(frame.document);
var frames = frame.frames;
for (var i = 0; i < frames.length; i++)
{
// recurse on each frame
searchshield.getDocuments(frames[i], frameArray);
}
return frameArray;
};
searchshield.NextSiblingNode = function (element)
{
var TEXTNODE = 3;
var ParentNode = element.parentNode;
if (!ParentNode)
return;
var NextSibling = ParentNode.nextSibling;
while (NextSibling)
{
if (NextSibling.nodeType != TEXTNODE)
return NextSibling;
NextSibling = NextSibling.nextSibling;
}
return;
};
searchshield.getParentNodeByAttribute = function (attrName, attrValue, node, maxDepth)
{
if (!node)
return null;
var maxLoop = maxDepth ? maxDepth : 1;
var pNode = node.parentNode;
if (!pNode)
return null;
for(; 0 < maxLoop; maxLoop--)
{
if ((pNode[attrName]) &&
(pNode[attrName].toLowerCase() === attrValue.toLowerCase()))
{
return pNode;
}
pNode = pNode.parentNode;
if (!pNode)
return null;
}
return null;
};
searchshield.getParentNodeByClassName = function (className, node, maxDepth)
{
return searchshield.getParentNodeByAttribute("className", className, node, maxDepth);
};
searchshield.getParentNodeById = function (id, node, maxDepth)
{
return searchshield.getParentNodeByAttribute("id", id, node, maxDepth);
};
searchshield.getParentNodeByTagName = function (tagName, node, attrName)
{ // find parent node by tag name and optional attribute name
if (!tagName || !node || !node.parentNode)
return null;
tagName = tagName.toUpperCase();
while ((node != null) && (node.nodeType != 9))
{
// if attrName is not provided just return TRUE
if (node.nodeName == tagName)
{
var nodeHasAttribute = !!attrName ? node[attrName] : true;
if (nodeHasAttribute)
return node;
}
node = node.parentNode;
}
// no div
return null;
};
searchshield.getHrefFromCiteElement = function (tag)
{
var rtnHtml;
var tp = tag.parentNode;
var tgpn = tp ? tp.parentNode : null;
if (!tgpn)
return;
lastChildElem = tgpn.lastChild;
while ((lastChildElem != null) && (lastChildElem.nodeName != 'SPAN') && (lastChildElem.nodeName != 'DIV'))
{
lastChildElem = lastChildElem.previousSibling;
}
if (lastChildElem)
rtnHtml = lastChildElem.getElementsByTagName('cite')[0];
if (rtnHtml)
rtnHtml = rtnHtml.innerHTML;
return rtnHtml;
};
searchshield.getHrefFromSpanElement = function (tag)
{
var rtnHtml;
var tp = tag.parentNode;
var tgpn = tp ? tp.parentNode : null;
if (!tgpn)
return;
siblingElem = tgpn.nextSibling;
while ((siblingElem != null) && (siblingElem.nodeName != 'SPAN') && (siblingElem.className != 'site'))
{
siblingElem = siblingElem.nextSibling;
if (siblingElem && siblingElem.className && (siblingElem.className.match(/res[13]/)))
break;
}
if (siblingElem)
rtnHtml = siblingElem.getElementsByTagName('a')[0];
if (rtnHtml)
rtnHtml = rtnHtml.innerHTML;
return rtnHtml;
};
searchshield.getTopLevelDocument = function (doc)
{ // return the top level document for the given doc, could be itself
// TODO: determine a method of doing this for IE, if necessary
// don't check about:blank
if (doc && ((doc.location.href == "about:blank") || (doc.location.href == "about:Tabs")))
return doc;
// Check if already a top level document
for (var i = 0; i < gBrowser.browsers.length; i++)
{
if (doc == gBrowser.browsers[i].contentDocument)
return doc;
}
// Not a top level, check all frames
var documents;
for (var j = 0; j < gBrowser.browsers.length; j++)
{
// get all docs for each browser
documents = searchshield.getDocuments(gBrowser.browsers[j].contentWindow, new Array());
for (var k = 0; k < documents.length; k++)
{
// check if doc is from current browser
if (doc == documents[k])
{
// it is, return the top level doc for this browser
return gBrowser.browsers[j].contentDocument;
}
}
}
return doc;
};
searchshield.getTopLevelWindow = function ()
{
// TODO: determine a method of doing this for IE, if necessary
return mediator.getMostRecentWindow("navigator:browser");
};
//Event functions
searchshield.addListener = function (object, evtType, listener, useCapture)
{
useCapture = !!useCapture;
if (object.addEventListener)
{
object.addEventListener(evtType, listener, useCapture);
return true;
}
else if (object.attachEvent)
{
object.attachEvent("on"+evtType, listener);
return true;
}
return false;
};
searchshield.cancelEvent = function (event)
{
event.cancelBubble = true;
event.returnValue = false;
};
searchshield.doEvent = function (evtObj, evtTarget, evtName, evtType, bubbles, cancelable)
{
bubbles = !!bubbles;
cancelable = !!cancelable;
if (document.createEvent)
{
var evt = document.createEvent("Events");
evt.initEvent(evtName, bubbles, cancelable);
evtTarget.dispatchEvent(evt);
return true;
}
else if (document.createEventObject)
{
var evt = document.createEventObject(evtObj);
evtTarget.fireEvent("on" + evtType, evt);
return true;
}
return false;
};
searchshield.removeListener = function (object, evtType, listener, useCapture)
{
useCapture = !!useCapture;
if (object.removeEventListener)
{
object.removeEventListener(evtType, listener, useCapture);
return true;
}
else if (object.detachEvent)
{
object.detachEvent(evtType, listener);
return true;
}
return false;
};
// HTML functions
searchshield.CleanupHTML = function (data)
{
if (data == null)
return data;
// cleanup html data, replace any new lines
data = data.replace(/\r/g, "");
data = data.replace(/\n/g, "");
// escape any single quotes
data = data.replace(/'/g, "\\'");
return data;
};
searchshield.removeHtmlTags = function (str)
{
var re = new RegExp('(<[^>]+>)','g');
var strStr = new String(str);
if (!!strStr)
return strStr.replace(re, '');
else
return str;
};
// Browser functions
searchshield.elementSize = function (element)
{
//returns an array [sizeX, sizeY]
var elemX;
var elemY;
elemX = parseInt(element.offsetWidth);
elemY = parseInt(element.offsetHeight)
return [elemX, elemY];
};
searchshield.GetFullBoundingRect = function (element)
{
if (!element) return;
// get bounding rect for incoming element
var elementRect = element.getBoundingClientRect();
var nextImg = null;
var nextImgRect = null;
// first check for another non-TextNode element after this one
var siblingElement = searchshield.NextSiblingNode(element);
if ( siblingElement &&
siblingElement.firstChild &&
siblingElement.id &&
siblingElement.id.indexOf("XPLSS_") != -1)
{
nextImg = siblingElement.firstChild;
nextImgRect = nextImg.getBoundingClientRect();
}
else
{
return elementRect;
}
if ((nextImgRect.top >= elementRect.bottom) &&
(nextImgRect.left <= elementRect.left))
{ // images appear to be on seperate lines
return elementRect;
}
// else merge the rects together into a new one
var newRect = new function() { this.top=0; this.left=0; this.right=0; this.bottom=0; this.mid=0;};
newRect.top = Math.min(elementRect.top, nextImgRect.top);
newRect.left= Math.min(elementRect.left, nextImgRect.left);
newRect.right=Math.max(elementRect.right, nextImgRect.right);
newRect.bottom=Math.max(elementRect.bottom, nextImgRect.bottom);
newRect.mid = Math.min(elementRect.right, nextImgRect.left);
return newRect;
};
searchshield.offsetLeft = function (element)
{
var offset = 0;
while (element)
{
offset += element.offsetLeft;
element = element.offsetParent;
}
return offset;
};
searchshield.offsetTop = function (element)
{
var offset = 0;
while (element)
{
offset += element.offsetTop;
element = element.offsetParent;
}
return offset;
};
searchshield.scrollSize = function (imageElem)
{
// returns an array [scrollX, scrollY, hasParentFrame]
var scrollX;
var scrollY;
var hasParentFrame;
// firefox
if (window.pageXOffset && window.pageYOffset)
{
scrollX = window.pageXOffset;
scrollY = window.pageYOffset;
}
else if (document.documentElement || document.body)
{
scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
scrollY = document.documentElement.scrollTop || document.body.scrollTop;
if (imageElem)
{
var frames = document.frames;
if (frames)
{
for (var i=0; i < frames.length; i++)
{
var img;
try {
img = frames[i].document.getElementById(imageElem.id);
}
catch(domErr){}
if (img != null)
{
scrollX = frames[i].document.documentElement.scrollLeft;
scrollY = frames[i].document.documentElement.scrollTop;
hasParentFrame = true;
break;
}
}
}
}
}
else
{
scrollX = 0;
scrollY = 0;
}
return [parseInt(scrollX,10), parseInt(scrollY,10), hasParentFrame];
};
searchshield.viewPortSize = function ()
{
// returns an array [width, height, scrollYWidth], where scrollYWidth is always 0 for IE
var scrollXWidth = 19;
var scrollYWidth = 0; // 0 for Microsoft IE
var scrollBarX = false;
var windowX;
var windowY;
// firefox
if (window.innerWidth && window.innerHeight)
{
//TODO: validate this block if implemented for firefox
windowX = window.innerWidth - scrollXWidth;
windowY = window.innerHeight;
try
{
scrollYWidth = Math.floor(Math.abs(window.innerHeight - document.documentElement.clientHeight)) + 1;
scrollBarX = (document.documentElement.clientWidth < document.documentElement.scrollWidth);
}
catch(err){}
if (scrollBarX && !scrollYWidth)
scrollYWidth = 18; //normally 17 (+1 top border)
}
else if (document.documentElement || document.body)
{
windowX = (document.documentElement.clientWidth || document.body.clientWidth) - scrollXWidth;
windowY = document.documentElement.clientHeight || document.body.clientHeight;
}
else
{
windowX = 0;
windowY = 0;
}
return [windowX, windowY, scrollYWidth];
};
searchshield.zoomLevel = function ()
{
var level = 1;
if (document.body.getBoundingClientRect) {
// rect is only in physical pixel size before IE8
var rect = document.body.getBoundingClientRect();
level = Math.round (((rect.right - rect.left) / (document.body.offsetWidth)) * 100) / 100;
}
return level;
};
// Href functions
searchshield.checkUrl = function (url)
{ // cleanup a url, make sure there is a protocol on the front for scanning
try {
// trim
url = url.replace(/^\s+/, "").replace(/\s+$/, "");
// if no protocol, add http:// to it
if (url.indexOf("://") == -1)
url = "http://" + url;
}
catch(err){}
return url;
};
searchshield.DoesURLContain = function (url, contain)
{
if ((url == null) || (url.length < 1))
return false;
// breakup the url to check
var parts = url.split('/');
if (parts.length < 3)
return false;
var domain= parts[2].toLowerCase();
if (domain.indexOf(contain) > -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 = searchshield.parseQuery(uri.query);
}
//non-standard urls require a fail-safe that relies on simply splitting the href
function splitLink(href)
{
// split the href on '/'
var linkParts = href.split("/");
// need domain and path
if ((linkParts == null) || (linkParts.length < 2))
return false;
var uri = {
delimiter: (linkParts[3]).substring(0,1),
host: linkParts[2],
hostArray: (linkParts[2]).split('.'),
path: (linkParts[3]).substring(1),
qsArray: [],
query: '',
scheme: (linkParts[0]).substring(0, linkParts[0].length-1),
source: href
};
return uri;
}
if (!uri.host)
uri = splitLink(href);
return uri;
};
searchshield.parseQuery = function (qs)
{
var qsArray = [];
qs.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,
function ($0, $1, $2) {
if ($1) qsArray[$1] = $2;
}
);
return qsArray;
};
// 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;
};
searchshield.getClickHandlerParams = function(clickHandler)
{
var re = /((?:'[^']*')|[\w]*)(?:,|\))/ig;
var chParams = [];
clickHandler.replace(re,
function($0, $1, $2){
if ($1)
chParams.push($1);
}
);
return chParams;
};
// general use functions - end
// Search 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',
'Yahoo',
'Bing',
'MSN', // MSN redirects to BING
'Baidu',
'Earthlink',
'AOL',
'Ask',
'Yandex',
'Seznam',
'Webhledani',
'eBay',
'Digg',
'Slashdot',
'Twitter',
'GMail',
'Facebook',
'MySpace'
];
return names;
};
searchshield.Search.prototype.detectEngine = function(href)
{
if (!href)
return;
var aEng = searchshield.Search.prototype.getSearchNames();
var aEngLen = aEng.length;
for (var i=0; i < 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 (!searchshield.enabled(doc))
return;
this.doc = doc;
this.href = this.doc.location.href;
this.uri = searchshield.parseLink(this.href);
try
{
this.searchHash = searchshield.avgCallFunc(this.doc, 'GetHash', this.href);
// get any previously active engine
this.engine = this.engineList[this.searchHash.toString()];
}
catch (e) {}
/*
Process Steps:
1. Add all supported search engines
2. Identify the active search engine
3. Get all document links and add AVG images
*/
// STEP 1 - Add all supported search engines
if (!this.engines)
{
var aEng = xplSearch.getSearchNames();
var aEngLen = aEng.length;
for (var i=0; i < 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: {
classname: ["green","yellow","orange","red"],
border: ["#00A120", "#EAA500", "#F57301", "#D20003"],
background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"]
}
};
this.filter_urls = [
"ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com",
"bluestreak.com", "clickbacktrack.net", "clickbank.net",
"clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com",
"dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com",
"dpi-digialphoto.com", "feedpoint.net", "hypertracker.com",
"jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com",
"mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com",
"offeredby.net", "offerweb.com", "pinktrax.com",
"pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com",
"r.rd06.com", "revenuewire.net", "s0b.bluestreak.com",
"s2.srtk.net", "servedby.advertising.com", "store.yahoo.com",
"tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com",
"tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com",
"www.yellowbookleads.com"
];
this.shortened_urls = [
"3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com", "t.co"
];
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 (this.type != 'inline' && !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";
img.style.styleFloat = "none";
// 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 repeat scroll 0 0 transparent";
}
// append the image to the link
anchor.appendChild(img);
// insert the node as either a sibling or a child
if (insertNode != null)
parentNode.insertBefore(anchor, insertNode);
else
parentNode.appendChild(anchor);
return anchor;
};
searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru)
{
var updated = false;
var frameDoc = this.search.doc;
var docFrames = frameDoc.frames;
var frameElem;
if (docFrames && 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;
if (!searchshield.quirksMode)
{
// create style for inline flyovers
var styleTag = doc.createElement("style");
styleTag.setAttribute("id","avgILFOStyle");
var headTag = doc.getElementsByTagName("head")[0];
headTag.appendChild(styleTag);
var inline_style = styleTag.styleSheet;
// stub in the base image name as the url
inline_style.addRule(".avgILFO", "background: url(linkscanner://default_inline_border_tl.png) no-repeat top left;");
inline_style.addRule(".avgILFO", "width:0px; font-size:0px; z-index:9999; visibility:hidden; position:absolute; left:-5000px;");
inline_style.addRule(".avgILFO_content", "background: url(linkscanner://default_inline_border_r.png) top right repeat-y;");
inline_style.addRule(".avgILFO_content","font-size:10px; color:black; padding:0px 10px; text-align:left; word-wrap:break-word; line-height:130%");
inline_style.addRule(".avgILFO_head", "background: url(linkscanner://default_inline_border_tr.png) no-repeat top right;");
inline_style.addRule(".avgILFO_head", "width:0px; height:5px;");
inline_style.addRule(".avgILFO_head div","height:5px;");
inline_style.addRule(".avgILFO_foot", "background: url(linkscanner://default_inline_border_bl.png) no-repeat bottom left");
inline_style.addRule(".avgILFO_foot", "height:5px;");
inline_style.addRule(".avgILFO_foot div", "background: url(linkscanner://default_inline_border_br.png) no-repeat bottom right");
inline_style.addRule(".avgILFO_foot div", "height:5px; width:0px;");
}
try {
// create the popup box
var box = doc.createElement("DIV");
if (searchshield.quirksMode)
{
box.style.visibility = "hidden";
box.style.position = "absolute";
box.style.left = "-5000px";
}
box.setAttribute("id", "XPLSS_InlineFlyover");
box.setAttribute("class", "avgILFO");
doc.body.appendChild(box);
box = null;
}
catch(boxErr){}
};
searchshield.SearchEngine.prototype.show_inline_ratings = function (doc, node, image)
{
var href = node.href;
var anchor = node.element;
if ((href == null) || (href.length < 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)});
return;
}
}
// severity -1 signifies sb.dat load failure
if ( nSeverity == -1 )
nSeverity = searchshield.XPLCHECK_RESULT_SEV_NONE;
//blacklist url
var blShortUrl = false;
if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_BLOCK)
{
var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);
if (shortUrl)
blShortUrl = true;
}
// need xlated cat tag and category
if (parts.length < 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, nSeverity)});
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.height = "12px";
img.style.border = "none";
img.style.padding = "0 3px";
img.style.margin = "0";
if ((html && html.length > 0) || (blUrl != undefined))
{
img.setAttribute("title", "");
img.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity, blUrl)});
img.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)});
}
// create the link element
var newAnchor = doc.createElement("A");
newAnchor.setAttribute("id", "avg_ls_anch");
newAnchor.style.display = "inline-block";
newAnchor.style.background = "none repeat scroll 0 0 transparent";
newAnchor.appendChild(img);
img = null;
// insert the node as either a sibling or a child
if (insertNode != null)
anchor.parentNode.insertBefore(newAnchor, insertNode);
else
anchor.parentNode.appendChild(newAnchor);
return newAnchor;
};
//////////////// SEARCH ENGINE ////////////////
/////////////// GOOGLE SEARCH ENGINE ///////////////
searchshield.GoogleSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
this.onlyPrimaries = false;
};
searchshield.GoogleSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.GoogleSearchEngine.prototype.constructor = searchshield.GoogleSearchEngine;
searchshield.GoogleSearchEngine.prototype.name = "google"; // the name by which the search engine is known (always lowercase)
searchshield.GoogleSearchEngine.prototype.validSearch = function(href) {
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var hostMatch = false;
var domain = uri.host;
// re stitch the uri path and query elements to
// use existing logic
var path = uri.path + uri.delimiter + uri.query;
// For Google the host must match:
// .google.com OR
// .google.com.XX OR
// .google.co.XX OR
// .google.XX where XX is a country code
// one special case is www.googe.off.ai (Anguilla)
// Where any subdomain can come before the top level domain
if ( /(\.(?:google|mozilla)\.(?:com|(?:co|off)\.[a-z]{2}|[a-z]{2}))/i.test(domain) )
{
//check the path
if ((path.indexOf("search?") == 0) ||
(path.indexOf("sponsoredlinks?") == 0) ||
(path.indexOf("webhp?") == 0) ||
(path.indexOf("webhp#") == 0) ||
(path.indexOf("#q=") == 0) ||
(path.indexOf("#hl=") == 0) ||
(path.indexOf("#sclient=") == 0))
{
return true;
}
}
return false;
};
searchshield.GoogleSearchEngine.prototype.includeLink = function(tag)
{
var href = "";
var outHref = false;
var findStr = "";
// check for interstitials
if (searchshield.DoesURLContain(tag.href, this.search.uri.host))
{
findStr = this.search.uri.host + "/interstitial?";
if (tag.className == "l" && 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);
// the destination url is in the href string of this redirector
if (outHref.indexOf('xg4ken.com') > -1)
{
urlPos = (unescape(outHref)).indexOf('url[]=') + 6;
var destUrl = (unescape(outHref)).substring(urlPos);
if (searchshield.FilterUrl(destUrl, this.filter_urls))
{
var destUrl = searchshield.getHrefFromCiteElement(tag);
if (destUrl)
return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));
return false;
}
return destUrl;
}
// filtered url but can get destination from href string
if (outHref.indexOf('altfarm.mediaplex.com') > -1)
{
var tmpoh = unescape(outHref);
var destUrl = tmpoh.substring(tmpoh.indexOf('DURL=')+5);
if (destUrl != null)
{
var destUrl = unescape(destUrl);
return destUrl;
}
}
// extract any fragment text, shouldn't be unescaped
var pound = outHref.indexOf("#");
if (pound != -1)
{
var fragment = outHref.substring(pound);
outHref = outHref.substring(0, pound);
outHref = unescape(outHref);
outHref += fragment;
if (searchshield.FilterUrl(outHref, this.filter_urls))
return false;
return outHref;
}
outHref = unescape(outHref);
if (outHref.indexOf("?") == -1)
{
var ampPos = outHref.indexOf("&");
if (ampPos != -1)
outHref = outHref.substring(0, ampPos);
}
if (searchshield.FilterUrl(outHref, this.filter_urls))
{
var destUrl = searchshield.getHrefFromCiteElement(tag);
if (destUrl)
return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));
return false;
}
return outHref;
}
}
// recommended link - use following to see one
// http://www.google.cz/search?hl=cs&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;
}
// special case for ie6 results
else if (searchshield.docMode == 6)
{
var parentNodeClass = tag.parentNode ? tag.parentNode.className : '';
if ((tag.className == '') && (parentNodeClass == 'r'))
{
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
// DIV elem GrandParent class of res1 or res3 is Sponsored Link
var parentNode = tag.parentNode;
var grandParentNode = 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;
}
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);
// the destination url is in the href string of this redirector
if (outHref.indexOf('xg4ken.com') > -1)
{
urlPos = (unescape(outHref)).indexOf('url[]=') + 6;
var destUrl = (unescape(outHref)).substring(urlPos);
if (searchshield.FilterUrl(destUrl, this.filter_urls))
{
var destUrl = searchshield.getHrefFromCiteElement(tag);
if (destUrl)
return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));
return false;
}
return destUrl;
}
// filtered url but can get destination from href string
if (outHref.indexOf('altfarm.mediaplex.com') > -1)
{
var tmpoh = unescape(outHref);
var destUrl = tmpoh.substring(tmpoh.indexOf('DURL=')+5);
if (destUrl != null)
{
var destUrl = unescape(destUrl);
return destUrl;
}
}
// extract any fragment text, shouldn't be unescaped
var pound = outHref.indexOf("#");
if (pound != -1)
{
var fragment = outHref.substring(pound);
outHref = outHref.substring(0, pound);
outHref = unescape(outHref);
outHref += fragment;
if (searchshield.FilterUrl(outHref, this.filter_urls))
return false;
return outHref;
}
outHref = unescape(outHref);
if (outHref.indexOf("?") == -1)
{
var ampPos = outHref.indexOf("&");
if (ampPos != -1)
outHref = outHref.substring(0, ampPos);
}
if (searchshield.FilterUrl(outHref, this.filter_urls))
{
var destUrl = searchshield.getHrefFromCiteElement(tag);
if (destUrl)
return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));
return false;
}
return outHref;
}
}
}
// else nothing
return false;
}
/////////////// AVG GOOGLE ///////////////
/////////////// YAHOO SEARCH ENGINE ///////////////
searchshield.YahooSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
};
searchshield.YahooSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.YahooSearchEngine.prototype.constructor = searchshield.YahooSearchEngine;
searchshield.YahooSearchEngine.prototype.name = "yahoo";
searchshield.YahooSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var domain = uri.host;
// re stitch the uri path and query elements to
// use existing logic
var path = uri.path + uri.delimiter + uri.query;
// prevent verdicts on news site until 69933 is fixed
if (domain == 'news.search.yahoo.com')
return false;
// For Yahoo the host must match:
// search.yahoo.com OR
// xx.search.yahoo.com where xx is the country code OR
// search.yahoo.co.jp OR
// for Yahoo China: one.cn.yahoo.com, search.cn.yahoo.com or www.yahoo.cn
if ((domain.match(/search\.yahoo\.co(?:m|\.jp)/i) ||
domain.match(/(?:search|one)\.cn\.yahoo\.com/i) ||
domain.match(/www\.yahoo\.cn/i)) &&
path.match(/^(?:search[;?]|s\?)/i))
{
return true;
}
return false;
};
searchshield.YahooSearchEngine.prototype.includeLink = function(tag)
{
var href = "";
var outHref = "";
var findStr = "";
// yahoo likes to encode the url
href = unescape(tag.href);
var spnsdLinks = searchshield.getParentNodeByTagName("DIV", tag, "className");
if ((spnsdLinks) &&
(spnsdLinks.className.indexOf('ads') > -1)) // sponsored links
{
if (!tag.parentNode)
return false;
// parse ads for em tag
var baseNode;
if (spnsdLinks.className.indexOf('ads horiz') > -1) // horizontal ads sections
baseNode = tag.parentNode.parentNode;
else
baseNode = tag.parentNode;
if (!baseNode || !baseNode.lastChild || baseNode.lastChild.tagName != 'EM')
return false;
var outHref = searchshield.removeHtmlTags(baseNode.lastChild.innerHTML);
return outHref;
}
if ((tag.className.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.indexOf('yahoo.com') != -1) || (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;
else
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];
// no verdicts for links on yahoo.com domain
if (/yahoo\.com/.test(domain))
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 ///////////////
/////////////// 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)
{
var displayStyle = (domain == 'bing.search.daum.net') ? 'inline-block' : 'inline';
this.addAnchorStyle = {
display: displayStyle
};
if (path.indexOf("search?") == 0)
return true;
}
return false;
};
searchshield.BingSearchEngine.prototype.includeLink = function(tag)
{
var outHref = false;
if (tag.tagName == 'IMG')
{ //no images
return false;
}
if (tag.href.charAt(0) == '/')
{ //no relative links
return false;
}
if (/trademarks/i.test(tag.id))
{
// don't link the trademark at the bottom of the page
return false;
}
if ((tag.parentNode) && (/sc_stc/i.test(tag.parentNode.id)))
{ // don't verdict the social sites - our verdict doesn't fit
return false;
}
else if (/vt_tl/i.test(tag.className))
{ // don't verdict the video images
return false;
}
else if (!!searchshield.getParentNodeByClassName("sw_t",tag,3))
{ // no links in page header
return false;
}
else if (searchshield.DoesURLContain(tag.href, "r.msn.co") ||
searchshield.DoesURLContain(tag.href, "overture.com"))
{ // france has r.msn.co and italy has overture.com sponsored links
// with the link in CITE element
var spanElements = null;
// top links - check for a CITE
spanElements = tag.getElementsByTagName("CITE");
if ((spanElements == null) || (spanElements.length <= 0))
{
if (tag.parentNode && tag.parentNode.parentNode)
spanElements = tag.parentNode.parentNode.getElementsByTagName("CITE");
}
if ((spanElements != null) && (spanElements.length > 0))
{
outHref = spanElements[0].innerHTML;
if (outHref != null)
{
// replace any nbsp's
outHref = outHref.replace(" ", " ");
// url is after the last space in the html, after the '-'
var space_pos = outHref.lastIndexOf(" ");
if (space_pos != -1)
outHref = outHref.slice(space_pos + 1);
outHref = searchshield.checkUrl(outHref);
// save the link
return outHref;
}
}
// side links
if (tag.lastChild != null)
{
outHref = tag.lastChild.innerHTML;
if (outHref != null)
{
outHref = searchshield.checkUrl(outHref);
// save the link
return outHref;
}
}
}
// no sponsored links for now
else if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||
searchshield.DoesURLContain(tag.href, ".live.com") ||
searchshield.DoesURLContain(tag.href, ".bing.com") ||
searchshield.DoesURLContain(tag.href, ".bing.net") ||
searchshield.DoesURLContain(tag.href, ".daum.net") ||
searchshield.DoesURLContain(tag.href, ".gmarket.co") ||
searchshield.DoesURLContain(tag.href, ".multimap.com") ||
searchshield.DoesURLContain(tag.href, "msn.") ||
searchshield.DoesURLContain(tag.href, "ms.ciao.") ||
searchshield.DoesURLContain(tag.href, "ms.ciao-") ||
searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||
searchshield.DoesURLContain(tag.href, "javascript:") ||
searchshield.DoesURLContain(tag.href, "go.microsoft.co") ||
searchshield.DoesURLContain(tag.href, "hotmail.co") ||
searchshield.DoesURLContain(tag.href, "cc.bingj.com") ||
searchshield.DoesURLContain(tag.href, "microsofttranslator.com") ||
searchshield.DoesURLContain(tag.href, ".engkoo.com") ||
searchshield.DoesURLContain(tag.href, "sealinfo.verisign.com") ||
searchshield.DoesURLContain(tag.href, "explabs.com") ||
searchshield.DoesURLContain(tag.href, "onlinehelp.microsoft.com") ||
searchshield.DoesURLContain(tag.href, ".myoverture"))
{
// not a link
return false;
}
else
return tag.href;
};
searchshield.BingSearchEngine.prototype.addImage = function(node, image, hidden)
{
var element = node.element;
var parentNode = node.element.parentNode;
var grandParentNode = !!parentNode ? parentNode.parentNode : null;
// if there are redundant links in the same grandparent then skip them
if (!!grandParentNode)
{
gpChildren = grandParentNode.childNodes;
for (var i=0; i < 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);
this.updateImageStyle = {
verticalAlign: null
};
};
searchshield.BaiduSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.BaiduSearchEngine.prototype.constructor = searchshield.BaiduSearchEngine;
searchshield.BaiduSearchEngine.prototype.name = "baidu";
searchshield.BaiduSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var hostMatch = false;
var domain = uri.host;
// re stitch the uri path and query elements to
// use existing logic
var path = uri.path + uri.delimiter + uri.query;
if (domain == "www.baidu.com" || path.indexOf("testBaidu") !== -1)
hostMatch = true;
if (hostMatch)
{
if (path.indexOf("s?") == 0)
return true;
}
return false;
};
searchshield.BaiduSearchEngine.prototype.includeLink = function(tag)
{
if (tag.className && 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;
}
};
/////////////// 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);
this.addImageStyle = {
display: "inline"
};
this.addAnchorStyle = {
display: null
};
this.updateImageStyle = {
verticalAlign: null,
display: "inline"
};
};
searchshield.AOLSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.AOLSearchEngine.prototype.constructor = searchshield.AOLSearchEngine;
searchshield.AOLSearchEngine.prototype.name = "aol";
searchshield.AOLSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var domain = uri.host;
//path may be 'aol/search' or 'search'
var pathArray = uri.path.split("/");
var aol = pathArray[0];
// re stitch the uri path and query elements
// to use existing logic
var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];
path += uri.delimiter + uri.query;
if (/search\.aol\.com/.test(domain))
{
if ((aol == "aol") &&
(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 topAnchor") != -1))
{ //parse for embedded href
if (tag.href.indexOf("/aclk?sa=") == -1)
return false;
var adurl = tag.href.indexOf("&adurl=http");
// if an adurl the destination href can be acquired from the onclick handler
if (adurl != -1)
{
var destUrl;
var clickHandler = tag.getAttribute('onclick');
if (clickHandler != null)
{
// the destination href is the 2nd parameter (zero-based array)
destUrl = searchshield.getClickHandlerParams(clickHandler)[1];
if (destUrl != null)
{
destUrl = searchshield.removeHtmlTags(destUrl.replace(/'/g,''));
return searchshield.checkUrl(destUrl);
}
}
}
return false;
}
if (tag.className == "find")
return tag.href;
return false;
};
searchshield.AOLSearchEngine.prototype.insertNodes = function(node, doc)
{
var element = node.element;
var score = node.score;
if (element && 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') || (cN[i].className == 'durl')))
return [cN[i].nextSibling, cN[i].parentNode];
}
}
var parent = searchshield.SearchEngine.prototype.insertNodes;
return parent.call(this, node, doc);
};
/////////////// AOL SEARCH ENGINE ///////////////
/////////////// ASK SEARCH ENGINE ///////////////
searchshield.AskSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
};
searchshield.AskSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.AskSearchEngine.prototype.constructor = searchshield.AskSearchEngine;
searchshield.AskSearchEngine.prototype.name = "ask";
searchshield.AskSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var domain= uri.host;
// re stitch the uri path and query elements
// to use existing logic
var path = uri.path + uri.delimiter + uri.query;
if ("www.ask.com" == domain)
{
if (path.indexOf("web?") == 0)
return true;
}
return false;
};
searchshield.AskSearchEngine.prototype.includeLink = function(tag)
{
var outHref = "";
var findStr = "";
if (/nu|info/i.test(tag.className))
{
// exclude green links
if ((tag.firstChild) &&
(tag.firstChild.className) &&
(tag.firstChild.className.indexOf('attrib') == 0))
{
return false;
}
// exclude sub links in tables
if (searchshield.getParentNodeByTagName("TD", tag))
{
return false;
}
// sponsored ads from redirect
var cN = tag.childNodes;
var cnLen = cN ? cN.length : 0;
for (var i=0; i < cnLen; i++)
{
if ((cN[i].nodeType == 1) &&
(cN[i].nodeName == 'SPAN') &&
(cN[i].className == 'T10'))
{
return searchshield.checkUrl(searchshield.removeHtmlTags(cN[i].innerHTML));
}
}
// 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);
// the destination url is in the href string of this redirector
if (outHref.indexOf('xg4ken.com') > -1)
{
urlPos = (unescape(outHref)).indexOf('url[]=') + 6;
var destUrl = (unescape(outHref)).substring(urlPos);
if (searchshield.FilterUrl(destUrl, this.filter_urls))
{
var destUrl = searchshield.getHrefFromCiteElement(tag);
if (destUrl)
return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));
return false;
}
return destUrl;
}
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;
}
}
if (searchshield.DoesURLContain(tag.href, this.search.uri.host))
{
return false;
}
// primary results have class containing title, L2 or L4 ( Wikipedia links )
else if (/title|L[0-9]/i.test(tag.className))
{
outHref = tag.href;
if (searchshield.FilterUrl(outHref, this.filter_urls))
return false;
return outHref;
}
return false;
};
searchshield.AskSearchEngine.prototype.insertNodes = function(node,doc)
{
var element = node.element;
var parentNode = node.element.parentNode;
// insert alt image
if (/XPLSS_/.test(element.id))
{
return [null, element];
}
var cN = element.getElementsByTagName('span');
for (var i=0; i < cN.length; i++)
{
if (/title|newAdFont/.test(cN[i].className))
{
return [cN[i].nextSibling, cN[i].parentNode];
}
}
return [null, parentNode];
};
/////////////// 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
{
// prevent verdicts on news site until 69933 is fixed
if (domain == 'news.search.yahoo.com')
return false;
// a reference to altavista must be present in yahoo search url
var pRef = (path.indexOf('altavista') != -1);
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("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;
// sponsored links
var spnsdLinks = searchshield.getParentNodeByTagName("DIV", tag, "className");
if (spnsdLinks && /ads/.test(spnsdLinks.className))
{
if (!tag.parentNode)
return false;
// parse ads for em tag
var baseNode;
// horizontal ads sections
if (/ads\shoriz/.test(spnsdLinks.className))
baseNode = tag.parentNode.parentNode;
else
baseNode = tag.parentNode;
if (!baseNode || !baseNode.lastChild || baseNode.lastChild.tagName != 'EM')
return false;
var outHref = searchshield.removeHtmlTags(baseNode.lastChild.innerHTML);
return outHref;
}
if ((tag.className == "spt") ||
(tag.className == "res") ||
(tag.className == "yschttl spt"))
{
findStr = "/**";
var pos = tag.href.indexOf(findStr);
if (pos != -1)
{
pos += 3;
outHref = tag.href.substring(pos);
outHref = unescape(outHref);
// no results for overture.com & 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];
// no verdicts for links on yahoo.com domain
if (/yahoo\.com/.test(domain))
return false
}
return outHref;
}
else
{
if (searchshield.DoesURLContain(tag.href, 'yahoo.com'))
return false;
else
return tag.href;
}
}
return false;
};
searchshield.AltaVistaSearchEngine.prototype.getImgElement = function (element)
{
while (element != null)
{
element = element.nextSibling;
if (element != null)
{
if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))
{ // not our id but hit another anchor no verdict
if (element.tagName == "A")
{
element = null;
break;
}
}
else if (element.tagName == "A")
break;
}
}
var rtnElem = !!element ? element.firstChild : element;
return rtnElem;
};
/////////////// ALTAVISTA SEARCH ENGINE ///////////////
/////////////// YANDEX SEARCH ENGINE ///////////////
searchshield.YandexSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
};
searchshield.YandexSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.YandexSearchEngine.prototype.constructor = searchshield.YandexSearchEngine;
searchshield.YandexSearchEngine.prototype.name = "yandex";
searchshield.YandexSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var domain= uri.host;
// re stitch the uri path and query elements
// to use existing logic
var path = uri.path + uri.delimiter + uri.query;
if ((domain.match(/yandex\.com|by|kz|ru|ua/i)) &&
(path.indexOf("yandsearch?") == 0))
{
return true;
}
return false;
};
searchshield.YandexSearchEngine.prototype.includeLink = function(tag)
{
if ((tag.href.charAt(0) == '/') || (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;
}
parentClass = tag.parentNode ? tag.parentNode.className : '';
gParentClass = (tag.parentNode && tag.parentNode.parentNode) ? tag.parentNode.parentNode.className : '';
if (parentClass.match(/moreinfo/i) || gParentClass.match(/moreinfo/i))
{
return false;
}
// links to alt searches on different engines have a classname == b-link
if ((tag.className == "b-link") || (tag.className == "b-serp-url__link"))
{
return false;
}
return tag.href;
};
searchshield.YandexSearchEngine.prototype.getImgElement = function (element)
{
while (element != null)
{
element = element.nextSibling;
if (element != null)
{
if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))
{ // not our id but hit another anchor no verdict
if (element.tagName == "A")
{
element = null;
break;
}
}
else if (element.tagName == "A")
break;
}
}
var rtnElem = !!element ? element.firstChild : element;
return rtnElem;
};
/////////////// YANDEX SEARCH ENGINE ///////////////
/////////////// SEZNAM SEARCH ENGINE ///////////////
searchshield.SeznamSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
this.elementAttribute = {
width: "18",
height: "18"
};
this.updateImageStyle = {
width: "18px",
height: "18px"
};
};
searchshield.SeznamSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.SeznamSearchEngine.prototype.constructor = searchshield.SeznamSearchEngine;
searchshield.SeznamSearchEngine.prototype.name = "seznam";
searchshield.SeznamSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
var domain= uri.host;
// re stitch the uri path and query elements
// to use existing logic
var path = uri.path + uri.delimiter + uri.query;
if ((domain.indexOf("search.seznam.cz") > -1) &&
((path.indexOf("?") == 0) || (path.indexOf("svet") == 0) || (path.indexOf("searchScreen") == 0)))
{
return true;
}
return false;
};
searchshield.SeznamSearchEngine.prototype.includeLink = function(tag)
{
if (/seznam/.test(tag.hostname))
return false;
// no verdicts on pictures unless broken verdict placement is fixed
if ((tag.className == 'picture') || (tag.className == 'pict'))
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;
};
/////////////// 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)
{
if (tag.href.indexOf("/redir.aspx?") != -1)
{
var ancestorNode;
// sponsored link
if ((ancestorNode = searchshield.getParentNodeByClassName("results sponsored", tag, 3)) != null)
{
if ((ancestorNode = searchshield.getParentNodeByClassName("res1", tag, 2)) != null)
{
var spanSibling = ancestorNode.nextSibling;
while (spanSibling.nodeName != 'SPAN')
{
spanSibling = spanSibling.nextSibling;
if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res1')
{
spanSibling = null;
break;
}
}
if (spanSibling)
outHref = spanSibling.innerHTML;
}
if (outHref)
return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));
}
if ((ancestorNode = searchshield.getParentNodeByClassName("right-sponsored", tag, 3)) != null)
{
var outHref;
if ((ancestorNode = searchshield.getParentNodeByClassName("res3", tag, 2)) != null)
{
var spanSibling = ancestorNode.nextSibling;
while (spanSibling.nodeName != 'SPAN')
{
spanSibling = spanSibling.nextSibling;
if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res3')
{
spanSibling = null;
break;
}
}
if (spanSibling)
outHref = spanSibling.innerHTML;
}
if (outHref)
return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));
}
// result link
if (searchshield.getParentNodeByClassName("results", tag, 3) != null)
{
if ((ancestorNode = searchshield.getParentNodeByClassName("res2", tag, 2)) != null)
{
if (tag.parentNode && (tag.parentNode.nodeName != 'P'))
return getLinkHref(ancestorNode);
}
}
}
return false;
function getLinkHref(aNode)
{
var spanElems = aNode.getElementsByTagName('span');
for (var i=0; i < spanElems.length; i++)
{
if (spanElems[i].className != 'site')
continue;
var outAnchor = spanElems[i].getElementsByTagName('a')[0];
if (outAnchor == null)
outAnchor = spanElems[i];
return searchshield.checkUrl(searchshield.removeHtmlTags(outAnchor.innerHTML));
}
return false;
}
};
/////////////// WEBHLEDANI SEARCH ENGINE ///////////////
/////////////// EBAY SEARCH ENGINE ///////////////
searchshield.eBaySearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
this.processFrames = true;
};
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
// 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;
// to avoid putting links on things that don't look like links
// need to filter them - only put verdict on last item in group
var pN = tag.parentNode;
if ((pN != null) &&
(pN.parentNode != null) &&
(pN.parentNode.nodeName == 'TD'))
{
// get last element node
var lastChild = pN.parentNode.children[pN.parentNode.children.length - 1];
while (lastChild.nodeType != 1)
{
lastChild = lastChild.previousSibling;
}
if (pN != lastChild)
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("mercadolibre") == -1) &&
(outHref.toLowerCase().indexOf("mercadolivre") == -1))
{
return outHref;
}
}
}
}
}
}
return false;
};
/////////////// EBAY SEARCH ENGINE ///////////////
/////////////// DIGG SEARCH ENGINE ///////////////
searchshield.DiggSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
this.new_links = false;
this.addAnchorStyle = {
background: "none transparent scroll repeat 0 0"
};
};
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.insertNodes = function(node,doc)
{
var element = node.element;
var parentNode = node.element.parentNode;
// insert alt image
if (/XPLSS_/.test(element.id))
{
return [null, element];
}
var prevSibling = parentNode.previousSibling;
while ((prevSibling != null) && (prevSibling.className != 'story-item-title'))
{
prevSibling = prevSibling.previousSibling;
}
if (prevSibling)
parentNode = prevSibling;
return [prevSibling.lastChild, parentNode];
};
/////////////// 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, 'ak.fbcdn.net'))
{
return false;
}
return tag.href
};
searchshield.FacebookSearchEngine.prototype.addImage = function(node, image, hidden)
{
var doc = this.search.doc;
this.init_inline_ratings(doc);
this.show_inline_ratings(doc, node, image);
};
/////////////// FACEBOOK SEARCH ENGINE ///////////////
/////////////// MYSPACE SEARCH ENGINE ///////////////
searchshield.MySpaceSearchEngine = function(search)
{
searchshield.SearchEngine.call(this, search);
this.showCleanVerdicts = false;
this.type = 'inline';
};
searchshield.MySpaceSearchEngine.prototype = new searchshield.SearchEngine();
searchshield.MySpaceSearchEngine.prototype.constructor = searchshield.MySpaceSearchEngine;
searchshield.MySpaceSearchEngine.prototype.name = "myspace"; // the name by which the search engine is known (always lowercase)
searchshield.MySpaceSearchEngine.prototype.validSearch = function(href)
{
var uri;
if (typeof(this.search) === 'undefined' || null === this.search)
uri = searchshield.parseLink(href);
else
uri = this.search.uri;
if(!uri || !uri.host)
return false;
if (uri.host.indexOf("www.myspace.com") != -1)
return true;
return false;
};
searchshield.MySpaceSearchEngine.prototype.includeLink = function(tag)
{
if (searchshield.DoesURLContain(tag.href, this.search.uri.host) )
return false;
if (tag.href.match(/\.msplinks\.com/i))
return searchshield.checkUrl(searchshield.removeHtmlTags(tag.innerHTML));
return tag.href
};
searchshield.MySpaceSearchEngine.prototype.addImage = function(node, image, hidden)
{
var doc = this.search.doc;
this.init_inline_ratings(doc);
this.show_inline_ratings(doc, node, image);
};
/////////////// MYSPACE SEARCH ENGINE ///////////////
/////////////// AVG TOOLBAR REPORTING ///////////////
var avgreport = {
BLOCK_SEVERITY: 3,
scanResult: function (doc, url, foundUrl, ip) {
// report scan end only if surf enabled
if ('1' != searchshield.avgCallFunc(doc, 'GetSurfEnabled'))
return;
// for now native is handling the interstitial
var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', url);
if ( results == null )
return;
var parts = results.split('::');
// need at least severity
if (parts == null)
return;
if (!ip)
ip = "";
// use a block severity if foundUrl is given
var severity = !!foundUrl ? avgreport.BLOCK_SEVERITY : parseInt(parts[0], 10);
var category = "";
var threat = "";
// fill in the category and threat if something was found
if (severity > 0)
{
category = parts[2];
threat = parts[4];
}
// else
// return;
var scan_result = searchshield.avgCallFunc(doc, 'ReportScanResult', url, url, threat, category, ip, severity);
var scan_end = avgreport.scanEnd(doc, url);
return (scan_result && scan_end);
},
scanEnd: function (doc, url) {
return searchshield.avgCallFunc(doc, 'ReportScanEnd', url);
},
GetInterstitialIP: function (interstitial) {
// simple regex to pull the IP address
var regex = /(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)/;
var match = regex.exec(interstitial);
if (!match)
return '';
return match[0];
}
}
/////////////// AVG TOOLBAR REPORTING ///////////////
/////////////// FLYOVERS ///////////////
var avglsflyover = {
count: 0,
poppedUp: false,
poppedElement: null,
reset: function () {
avglsflyover.count = 0;
avglsflyover.poppedUp = false;
avglsflyover.poppedElement = null;
},
popup: function (event, hash, search, flyover) {
if (!event)
event = window.event;
var div = document.getElementById("XPLSS_Flyover");
if (div == null)
return;
// establish target element and get its containing document object
// in case verdict is inside a frame
var eventTarget = event.srcElement;
var frameDoc = eventTarget.ownerDocument;
// if the element is the clock, don't pop over it
if ((eventTarget.src != null) && (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;
// needed to prevent the flyover from hiding inadvertantly in IE7
if (searchshield.docMode == 7) {
div.style.backgroundColor = "#fff";
}
// there is an unwanted text node that causes vertical misalignment of flyover
if (div.firstChild.nodeType == 3)
div.removeChild(div.firstChild);
avglsflyover.poppedUp = true;
// reset display count
avglsflyover.count = 0;
avglsflyover.position();
},
hide: function (event) {
var frameDoc = document || top.document;
var div = frameDoc.getElementById("XPLSS_Flyover");
if ((div == null) || (div.style == null) || (div.style.visibility == "hidden"))
return;
var trans_div = frameDoc.getElementById("XPLSS_Trans");
if ((trans_div == null) || (trans_div.style == null) || (trans_div.style.visibility == "hidden"))
return;
// scroll and keydown events will pass a null event by design
// toElement will be null when mousing out of frameelement containing a verdict
if (event == null || event.toElement == null)
{
return;
}
if (trans_div.contains(event.toElement) || div.contains(event.toElement))
return;
// if the toElement is a cooresponding alt image then don't hide
// use try/catch because toElement will be null when mousing out of frame
try {
if (!!event.toElement.id && !!event.srcElement.id)
{
if (event.toElement.id.indexOf(event.srcElement.id.substring(0,event.srcElement.id.length-2)) == 0)
return;
if (event.srcElement.id == 'XPLSS_Trans' && /XPLSS_\d+VU\d/.test(event.toElement.id))
return;
}
}
catch(err){}
// hide and move somewhere off screen (negative offsets)
div.style.visibility = "hidden";
div.style.left = "-2100px";
div.style.top = "-2100px";
trans_div.style.visibility = "hidden";
trans_div.style.left = "-2100px";
trans_div.style.top = "-2100px";
return true;
},
position: function () {
if (!avglsflyover.poppedUp || (avglsflyover.poppedElement == null))
return;
var flyover = document.getElementById("XPLSS_Flyover");
if (flyover == null)
return;
// relative position of flyover in relation to icon
var locateX = 0; // 0=left, 1=right
var locateY = 0; // 0=above, 1=below, 2=beside icon
// get window sizes
var winSize = searchshield.viewPortSize();
var windowX = winSize[0];
var windowY = winSize[1];
// get the exact size of the flyover
var flyoverSize = searchshield.elementSize(flyover);
var flyoverX = flyoverSize[0];
var flyoverY = flyoverSize[1];
var verdictWidth = 0;
if (avglsflyover.poppedElement && 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 + verdictWidth + "px";
trans.style.height = flyoverY + "px";
}
avglsflyover.display();
},
display: function () {
avglsflyover.count++;
if (avglsflyover.count == 1)
{
var flyover = document.getElementById("XPLSS_Flyover");
if (flyover == null)
return;
// show the flyover, must use a little count to tell, crazy stuff
flyover.style.visibility = "visible";
flyover.onmouseout = function(){
avglsflyover.hide(event);
};
// show the transparent layer
var trans_div = document.getElementById("XPLSS_Trans");
if (trans_div == null)
return;
trans_div.style.visibility = "visible";
trans_div.onmouseout = function(){
avglsflyover.hide(event);
};
avglsflyover.poppedUp = false;
}
},
show: function () {
var div = document.getElementById("XPLSS_Flyover");
if (div == null)
return;
div.style.visibility = "visible";
var trans_div = document.getElementById("XPLSS_Trans");
if (trans_div == null)
return;
trans_div.style.visible = "visible";
}
};
var avglsinlineflyover = {
build: function (riskCategory, riskName, bgColor, borderColor) {
var html = '';
html += '
html += '

';
html += riskCategory + '
';
html += riskName + '
';
html += '
return html;
},
popup: function (event, flyover, nSeverity, blUrl) {
//set verdict info
var div = document.getElementById('XPLSS_InlineFlyover');
if (div == null)
return;
// blUrl is an object for a blacklisted short url
// when it is passed get the final url
if (blUrl != undefined)
{
var finalUrl = searchshield.avgCallFunc(document, 'GetFinalUrl', blUrl.sUrl);
var riskUrl = blUrl.sUrl;
if ((finalUrl) && (searchshield.FilterUrl(finalUrl, xplSearch.engine.shortened_urls)))
finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);
var riskName = blUrl.riskNameLabel + finalUrl;
flyover = avglsinlineflyover.build(blUrl.riskCategory, riskName, blUrl.bgColor, blUrl.borderColor);
}
div.innerHTML = flyover;
div.style.width = "auto"; //reset width
div.style.position = "absolute";
if (searchshield.quirksMode || searchshield.docMode <= 7)
{
var className = xplSearch.engine.inline.color.classname[nSeverity];
var imgBase = "linkscanner://" + className + "_inline_border_";
var divWidth = searchshield.elementSize(div)[0];
//round up to nearest 10 to avoid intentional wrapping in div
var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));
var ilfoDivs = div.getElementsByTagName("div");
if (ilfoDivs && ilfoDivs.length == 5)
{
//div.style.fontSize = "10px";
div.style.backgroundImage = "url(" + imgBase + "tl.png)";
div.style.backgroundPosition = "0 0";
div.style.backgroundRepeat = "no-repeat";
div.style.width = flyoverWidth + "px";
div.style.zIndex = "9999";
// avgILFO_head
ilfoDivs[0].style.backgroundImage = "url(" + imgBase + "tr.png)";
ilfoDivs[0].style.backgroundPosition = "top right";
ilfoDivs[0].style.backgroundRepeat = "no-repeat";
ilfoDivs[0].style.width = flyoverWidth + "px";
ilfoDivs[0].style.height = "5px";
// avgILFO_head div
ilfoDivs[1].style.height = "5px";
// avgILFO_content
ilfoDivs[2].style.backgroundImage = "url(" + imgBase + "r.png)";
ilfoDivs[2].style.backgroundPosition = "top right";
ilfoDivs[2].style.backgroundRepeat = "repeat-y";
ilfoDivs[2].style.fontSize = "10px";
ilfoDivs[2].style.color = "black";
ilfoDivs[2].style.padding = "0px 10px";
ilfoDivs[2].style.textAlign = "left";
ilfoDivs[2].style.wordWrap = "break-word";
ilfoDivs[2].style.lineHeight = "130%";
// avgILFO_foot
ilfoDivs[3].style.backgroundImage = "url(" + imgBase + "bl.png)";
ilfoDivs[3].style.backgroundPosition = "bottom left";
ilfoDivs[3].style.backgroundRepeat = "no-repeat";
ilfoDivs[3].style.height = "5px";
// avgILFO_foot div
ilfoDivs[4].style.backgroundImage = "url(" + imgBase + "br.png)";
ilfoDivs[4].style.backgroundPosition = "bottom right";
ilfoDivs[4].style.backgroundRepeat = "no-repeat";
ilfoDivs[4].style.width = flyoverWidth + "px";
ilfoDivs[4].style.height = "5px";
}
else
{
div.style.fontSize = "10px";
div.style.backgroundColor = xplSearch.engine.inline.color.background[nSeverity];
div.style.border = xplSearch.engine.inline.color.border[nSeverity] + " solid 3px";
div.style.padding = "3px 8px";
}
}
else
{
// apply updated styles for new flyover content
var sheets = document.styleSheets;
for (var i=0; i < sheets.length; i++)
{
if (sheets[i].id && sheets[i].id == "avgILFOStyle")
{
var avgILFOStyle = sheets[i];
break;
}
}
if (typeof(avgILFOStyle) !== "undefined")
{
var className = xplSearch.engine.inline.color.classname[nSeverity];
var divWidth = searchshield.elementSize(div)[0];
//round up to nearest 10 to avoid intentional wrapping in div
var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));
var rules = avgILFOStyle.rules;
for (var i=0; i < rules.length; i++)
{
var bgImg = rules[i].style.backgroundImage;
var selText = rules[i].selectorText.toLowerCase();
if (bgImg)
{
var bgImgStyle = bgImg.replace(/default/, className);
rules[i].style.backgroundImage = bgImgStyle;
}
if (((selText == ".avgilfo") ||
(selText == ".avgilfo_head") ||
(selText == ".avgilfo_foot div")) &&
(rules[i].style.width) && (rules[i].style.width == "0px"))
{
rules[i].style.width = (flyoverWidth) + "px";
}
}
}
}
if (!event)
event = window.event;
var eventTarget = event.srcElement;
avglsinlineflyover.position(eventTarget);
},
hide: function (event) {
if (!event)
event = window.event;
var div = document.getElementById("XPLSS_InlineFlyover");
if (div == null)
return;
div.style.visibility = "hidden"; //invisible
div.style.left = "-5000px";
if (!searchshield.quirksMode)
{
// reset flyover styles
var sheets = document.styleSheets;
for (var i=0; i < sheets.length; i++)
{
if (sheets[i].id && sheets[i].id == "avgILFOStyle")
{
var avgILFOStyle = sheets[i];
break;
}
}
if (typeof(avgILFOStyle) !== "undefined")
{
var rules = avgILFOStyle.rules;
for (var i=0; i < rules.length; i++)
{
var bgImg = rules[i].style.backgroundImage;
var selText = rules[i].selectorText.toLowerCase();
if (bgImg)
{
var bgImgStyle = bgImg.replace(/:\/\/([a-z]+)_/i, '://default_');
rules[i].style.backgroundImage = bgImgStyle;
}
if (((selText == ".avgilfo") ||
(selText == ".avgilfo_head") ||
(selText == ".avgilfo_foot div")) &&
(rules[i].style.width))
{
rules[i].style.width = "0px";
}
}
}
}
},
position: function (imageElem) {
var flyover = document.getElementById('XPLSS_InlineFlyover');
if (flyover == null)
return;
// relative position of flyover in relation to icon
var locateX = 0; // 0=left, 1=right
var locateY = 0; // 0=above, 1=below, 2=beside icon
// get window sizes
var winSize = searchshield.viewPortSize();
var windowX = winSize[0];
var windowY = winSize[1];
// Must know if there is a horizontal scroll bar for Firefox
// for proper flyover positioning near bottom edge
var scrollYWidth = winSize[2];
var scrollBarX = winSize[2] > 0 ? true : false;
// get the exact size of the flyover
var flyoverSize = searchshield.elementSize(flyover);
var flyoverX = flyoverSize[0];
var flyoverY = flyoverSize[1];
flyover.style.width = flyoverX + "px";
// get the bounding rect for image(s)
var imgRect = imageElem.getBoundingClientRect();
// half width/height (center) of element bounding rect
var halfX = (imgRect.right - imgRect.left) / 2;
var halfY = (imgRect.bottom- imgRect.top) / 2;
// element the mouse is over, get the center position
var posX = searchshield.offsetLeft(imageElem) + halfX;
var posY = searchshield.offsetTop(imageElem) + halfY;
var pageOffsetX = 0;
var pageOffsetY = 0;
var hasParentFrame = false;
// normalize pos to 0 -- get amount of scrolling in browser window
var scroll = searchshield.scrollSize(imageElem);
pageOffsetX = scroll[0];
pageOffsetY = scroll[1];
hasParentFrame = scroll[2];
posX -= pageOffsetX;
posY -= pageOffsetY;
//compensate for Firefox 3
if (posX < imgRect.left)
posX = imgRect.left+halfX;
// setup the offsets
var offsetX = posX;
var offsetY = posY;
// calc where to display on page
if ((windowX - posX) > posX)
{
// right
//offsetX += halfX;
offsetX = imgRect.right + 3;
locateX = 1;
}
else
{
//left
//offsetX -= (flyoverX + halfX);
offsetX = imgRect.left - flyoverX - 3;
}
if ((windowY - posY) > posY)
{
// below
if (posY < (windowY/4))
{
offsetY -= halfY;
locateY = 1;
}
else
{
offsetY -= (flyoverY / 2) - halfY;
locateY = 2;
}
}
else
{
// above
if ((windowY - posY) < (windowY/4))
{
offsetY -= (flyoverY - halfY);
}
else
{
offsetY -= (flyoverY / 2) + halfY;
locateY = 2;
}
}
// make sure we aren't off the screen
if (offsetY < 0)
offsetY = 0;
if ((offsetY + flyoverY) > windowY)
{
offsetY = windowY - flyoverY;
}
else if (scrollBarX && ((windowY - (posY + halfY)) < scrollYWidth))
{ //verdict overlaps the horizontal scrollbar
offsetY = windowY - (flyoverY + scrollYWidth);
}
// add page offsets back - if not in frame
if (!hasParentFrame)
{
offsetX += pageOffsetX;
offsetY += pageOffsetY;
}
//posX += pageOffsetX;
//posY += pageOffsetY;
//var paddedOffsetX = 0; //provide space between icon and flyover
//var padX = 3;
//if (locateX == 0)
// paddedOffsetX = offsetX - padX;
//else
// paddedOffsetX = offsetX + padX;
// set where to put the flyover
flyover.style.top = offsetY + "px";
flyover.style.left = offsetX + "px";
avglsinlineflyover.display();
},
display: function () {
var div = document.getElementById('XPLSS_InlineFlyover');
if (div == null)
return;
// show the flyover
div.style.visibility = "visible";
},
imageExists: function(element) {
if (element)
{
// check next siblings children
var sibling = element.nextSibling;
if ((sibling == null) || (sibling.getElementsByTagName == null))
return false;
var images = sibling.getElementsByTagName("IMG");
if (images == null)
return false;
for (var i = 0; i < images.length; i++)
{
if (images[i].id == "avg_ls_image")
return true;
}
}
return false;
},
getImage: function (anchor) {
if (anchor)
{
var imageElem = null;
var images = anchor.getElementsByTagName("img");
if (images == null)
return imageElem;
for (var i = 0; i < images.length; i++)
{
if (images[i].id == "avg_ls_image")
{
imageElem = images[i];
break;
}
}
return imageElem;
}
},
getUrlFromQueryString: function (inUrl) {
var url = inUrl;
var uri = searchshield.parseLink(unescape(inUrl));
if (uri.source != null)
{ // regexp failed so used split to parse url
var qsUrl = uri.source.indexOf("?url=");
if (qsUrl != -1)
url = uri.source.substring(qsUrl + 5);
else
url = uri.source;
}
else if ((uri.qsArray.url != null) && (uri.qsArray.url.length > 0))
{
url = uri.qsArray.url;
}
return url;
},
mouseOverHandler: function (e, doc, engine) {
if (e && e.srcElement && e.srcElement.href)
{
// need to keep a reference to the function registered
// by the listener to be able to remove it.
var handlerFunc = arguments.callee;
var element = e.srcElement;
var href = e.srcElement.href;
// need an engine
if (!engine)
return;
// check if it has an image already
if (avglsinlineflyover.imageExists(element))
return;
// add the image, returns the anchor not the image
var new_element = engine.add_inline_image(doc, element, null, null);
// do the check and update in the background
setTimeout(function() {avglsinlineflyover.checkAndUpdate(doc, element, new_element, engine, handlerFunc)}, 1);
}
},
checkAndUpdate: function (doc, element, new_element, engine, handlerFunc) {
if (!engine)
return;
try {
// remove the listener and get final url
element.detachEvent("onmouseover", handlerFunc, false);
var finalUrl = searchshield.avgCallFunc(doc, 'GetFinalUrl', element.href);
}
catch(e) {}
if ((typeof(finalUrl) != 'undefined') && finalUrl)
{
// if still a tiny url check for final url embedded in querystring
if (searchshield.FilterUrl(finalUrl, engine.shortened_urls) &&
(finalUrl.indexOf("?url=") != -1))
{
finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);
}
// update the verdict
engine.display_inline(doc, new_element, finalUrl, null, true);
}
else
{
engine.avg_ls_inline_hide_verdict(new_element);
}
}
};
/////////////// FLYOVERS ///////////////
(function(){
setTimeout( function() {
try {
if ((self == top) && top.document) {
searchshield.init(top.document);
}
}
catch(e){return;}
}, 1 );
return;
})();
- 2 comments
- 20188 reads
Happy Birthday Adam
Submitted by alfred on Sat, 2011-10-15 00:03Happy Birthday Adam!
Thought we'd let it slip by unnoticed did ya?
Hope you have a great day and manage to wet a line.
And once again, thanks for a great site!
- 29 comments
- 2769 reads
smelly fish frames, the funniest thing happened today.
Submitted by quindieselbrad on Fri, 2011-10-14 21:22i got home today and noticed that a tub of fish frames went missing from the back yard, hell they stunk so bad i couldnt work out who would want them etc
so i jumped on the cams and noticed my neighbour from over the back fence, entered my yard and dragged the tub away :) a little embarresed at first, i called out to him and said sory about the smell etc
he told me that wasnt the main issue .two ppl from his street were talking about if the smell could be a dead body and should they call the cops and report it. my neighbour said he would get rid of the tub of dead fish frames and see if the"dead body " smell went away.
i can tell u for sure that the smell has gone away, the funny part was it stirred the next street up over 150mtrs away lol :) gold
moral of story, dont leave fish heads out back to go foul over a 3week period, clean ya mess up and bin it immediately b4 u have the feds at your door asking where u hide the dead bodies bahahahaha
- 7 comments
- 2349 reads
REVHEADS
Submitted by Jody on Fri, 2011-10-14 13:16The almighty XY GTHO
Hit that volume control to MAX .............. ![]()
![]()
![]()
http://www.mustang.org.au/forum/viewthread.php?tid=15263
- 27 comments
- 5079 reads
The Art of Flight - sick new snowboarding flick
Submitted by Ben Derecki on Fri, 2011-10-14 10:32This has just opened at Event Cinemas Innaloo, I'm hoping it's still going next Friday night as it's the soonest I can get there. Looks rad!
Trailer 1 (watch it in HD if you can)
Trailer 2
- 6 comments
- 1744 reads
Experts say shark nets a waste of money
Submitted by bod on Thu, 2011-10-13 14:01Shark nets a waste of money

Shark nets offer little more than a false sense of security and usually trap other animals, experts say. Source: The Daily Telegraph
AN army of marine researchers and shark experts have warned against installing shark nets in Western Australia to try to reassure the public after a string of white pointer attacks.
They said shark nets used in other states were a waste of money that did little more than create a false sense of security while indiscriminately killing other animals, including dolphins, whales and turtles, and WA would be "foolish" to go down that path.
As the search for missing Perth businessman Bryn Martin, who is believed to have been taken by a white pointer at Cottesloe Beach on Monday, wound down yesterday, swimmers at another Perth beach were forced from the water when a jet skier reported seeing a large shark 200m offshore.
Mullaloo Beach was closed for several hours as police scanned the water but there were no further sightings.
Police said the search for Mr Martin's remains would resume today but had been scaled down.
But he said the great whites in West Australian waters would not be reduced by nets, which were generally just 150m long.
"The sharks we're talking about there are transients. They don't live at Cottesloe or Perth beaches, they're just passing through, and the chances of them hitting a net are so low that it's almost pointless," he said.
Murdoch University's David Morgan said the nets also risked attracting more white pointers to feed off other animals caught in the mesh.
Trevor Long, director of marine research at Seaworld on the Gold Coast, said the nets used in Queensland were frequently ineffective because the sharks could swim between them.
But Vic Peddemors, a shark biologist with the NSW government, said the state would spend $1.4 million this year deploying nets at 51 beaches and the program had been phenomenally successful.
http://www.theaustralian.com.au/news/health-science/shark-pan-nets-as-a-waste-of-money/story-e6frg8y6-1226165301618
- 7 comments
- 3725 reads
Low winds with 3m Swell
Submitted by chris raff on Thu, 2011-10-13 07:57Hi guys was hoping to take the kids squiding over the weekend in the sound...in a 14ft tinny...seabreeze has low winds with 3m swell how does this translate in the sound a couple hundred metres offshore...do you think it'll still be pretty choppy in there....it's a 30min drive so was hoping to gets the heads up before going down...thanks in advance..
- 11 comments
- 2852 reads
Wilbinga or Moore River or...
Submitted by hillinb on Wed, 2011-10-12 23:38Gday folks,
Was going to take some friends up to wilbinga on Saturday arvo for a fish and a barbie, but I figured every Man and his dog will be there, So my question and is about any other options?
I was also toying with the idea of taking the up Moore river in the tinny, does anybody have some recent feedback regarding the river, condition, fishing, access, how far up? , any good spots to pull up for a stubbie.
Any other good day trip areas around Perth?
- 4 comments
- 1962 reads
fishing etiquette
Submitted by harro on Wed, 2011-10-12 19:31This is not a negative thread ,nor stirring thread, simply an etiquette discussion, on how some skippers charge or run there're boats and also for the deckies to learn and be prepared for going out on people's boats, giving handy hints and some insight of what they can help with etc, at the end of the day it's about good times and good fun fishing, I'm always happy to offer spots out its a great way to meet keen fishes like myself, and I have learned a hell of a lot from the deckies regarding fishing techniques, as I am pretty old school , lol
- 65 comments
- 3733 reads
Kuta v Sanur
Submitted by Shorty on Wed, 2011-10-12 17:05Went to Bali last week being the 3rd trip over before was 10 / 20 years ago,,always stayed in Kuta but is feeling a bit crowded and a bit of a madhouse these days could not go down the beach without 20-30 massage,crossbow,necklaces,Drug sellers not taking no for an answer,,,in short could not relax down there anymore tho it was getting that way 10 years ago,,i heard a couple folks saying they stay at Sanur these days,,i think i saw Sanur beach when visiting Turtle island not sure,,,anybody had any good experiences staying in the Sanur area ? prefer it over Kuta or to quiet ?
- 8 comments
- 2842 reads
Spool belts / bands?
Submitted by scano on Tue, 2011-10-11 20:43G,day all, Looking to purchase several reel spool belts / bands. Those ones you quite often see around the braided line area of the spool on stella's ect. My question is where is a good place or website to buy them? From what I have seen they can be up to about $20 each? not too sure if the mrs would be impressed with me spending a couple of hundred bucks on what appears in her eyes as some small strips of Velcro ( I need at least 8-10 line holders) The main advantage of the Velcro types is they don't rub on the reel line roller area. Also they can be used on baitcaster reels alot easier.
Any info on a good source to purchase them from would be very helpful
Cheers Scano
- 4 comments
- 2044 reads
Cottesloe search continues for shark victim
Submitted by bod on Tue, 2011-10-11 11:57Beach closed as police search for Cottesloe shark victim
Swimmers ventured into the water at Cottesloe beach this morning as police continued to search for the remains of a man believed to have been taken by a great white shark yesterday.
Bryn Martin, 64, went missing yesterday morning while swimming off Cottesloe Beach, and experts say damage to his recovered bathers are consistent with an attack by a 3m great white shark.
Cottesloe Beach will be closed until at least Wednesday while police search for Mr Martin's remains.
Senior Sergeant Denise Grant said her concern today was not for swimmers using the closed beach but in returning Mr Martin home to his family.
After making his brief statement to the media Mr Martin's son Alistair said the family had been overwhelmed by the rescue efforts to find his dad.
A keen swimmer, he competed in the Rottnest Channel Swim and set the record for the oldest male duo swimmer in 2002.
Police this morning confirmed that the search for Mr Martin is no longer a rescue effort but a recovery operation, although police divers decided that conditions were too dangerous to go into the murky water today, visibility being very low.
Cottesloe Beach will be closed until at least Wednesday while police search for Mr Martin's remains.
Sgt Grant said fisheries' experts believed tears to Mr Martin's black Speedo bathers, which were recovered yesterday, were consistent with damage caused by a 3m great white pointer.
Mr Martin was last seen by a friend swimming out past the pylon in front of the Indiana Tea Rooms at about 8am on Monday morning. He was a couple of hundred metres offshore when he disappeared. His wife raised the alarm at about 9.30am after he did not arrive for breakfast and the family conducted a search of the beach.
The Defence Force assisted with the search using ATV vehicles, while water police and local surf lifesavers scoured the ocean on boats and jet skis.
“He was swimming by himself at the time, however he was down at the beach with a friend," Sgt Grant said.
"His friend was entering the water, he saw him and about 10 minutes later he couldn’t see him anymore."
A Surf Life Saving WA helicopter was not monitoring Cottesloe Beach yesterday morning because it does not patrol during weekdays until mid-December.
Cottesloe Beach was closed in November last year after several sightings of a 2.5m shark that was attracted to baitfish in the area.
The shark was first spotted at 11am and again at 3.30pm on November 16. It came just a week after young tour guide Elyse Frankcom was bitten by a shark off Garden Island.
Edited from http://www.perthnow.com.au/news/man-missing-off-cottesloe-beach/story-e6frg12c-1226163060315
- 45 comments
- 4337 reads
2 from 2
Submitted by scotto on Tue, 2011-10-11 09:34another one. a suspected 3m GW. ``Fisheries experts have viewed the bathers and were of the opinion the damage is consistent with that a white pointer shark could cause,''. i wonder whether it was fishing fanatic's mate from a few weeks ago??
a touch more concerning, is its still early in the GW season, and now thats 2 fatal attacks in a matter of weeks.
http://www.perthnow.com.au/news/man-missing-off-cottesloe-beach/story-e6frg12c-1226163060315
im thinkin spraying my mates wetsuit with tuna oil this season may not be as funny as in previous years...
- 3 comments
- 2869 reads
Bullsharks living in lake at Brisbane golf course
Submitted by bod on Tue, 2011-10-11 00:40Six bullsharks have become a tourist attraction at the 14th tee at Carbrook Golf Club in Brisbane. The sharks got onto the Queensland golf course when it flooded some years ago after a river broke its banks. They became stranded when the water receded but now they are thriving and even breeding.
The sharks, which are between 2.4 and 3 metres long, are thrown meat to encourage them to come to the surface although the lake is well stocked with fish.
They have become renowned as a tourist attraction and there is a monthly tournament called the Shark Lake Challenge.


Kids used to jump in the lake retrieving golf balls for pocket money.

- 5 comments
- 7674 reads
new
Submitted by newbietothis on Mon, 2011-10-10 14:50New to this, so Hi, just bought our first boat, 5m runaround, son taken interest in fishing, once all certs and boat awareness done \i would like to take him out just off hillarys near where we live, keeping the shore in view at all times lol.
any good advice how where and when to whet his appetite invited, and with experience take some trips down the river etc.
- 9 comments
- 2599 reads
Cheapest dry malt extract in Perth - makin beer!
Submitted by lunker on Mon, 2011-10-10 14:28Hey guys, I've been getting into a bit of all-extract beer brewing, and I can tell you the different between that and a kit is amazing!!
Problem is it gets a bit dear - does anyone know where to get cheap dry malt? Cheapest i've seen is bout 13 bucks a kilo
Cheers!!
- 2 comments
- 2535 reads
GPS validation at boat ramps soon
Submitted by bod on Mon, 2011-10-10 11:56GPS validation system to improve boating safety
Release date: 10/10/11
In an Australian first, skippers throughout WA will soon be able to validate their Global Positioning System (GPS) equipment at local boat ramps and jetties using special markers and displayed coordinates.
The marine safety initiative, implemented by the Department of Transport (DoT) with assistance from Main Roads WA and the Surveying and Spatial Sciences Institute (SSSI), is designed to assist navigation and give skippers confidence in using their GPS system.
DoT General Manager of Coastal Infrastructure Steve Jenkins said WA's vast coastline was sometimes difficult to navigate due to the limited number of reference points, particularly in remote areas.
"This initiative encourages skippers to use their GPS in conjunction with traditional charts to navigate their safe return from sea," Mr Jenkins said.
At 34 maritime facilities extending from Esperance to Derby and including some yacht clubs in the metropolitan area, DoT will position the markers, engraved with a location code, in an area accessible to skippers either on the road, kerb or jetty.
On site signage will show the coordinates for the marker enabling skippers with built in or portable GPS units to validate both the coordinates and display datum of their unit which can then be entered as waypoints.
Where signage is not used to display the coordinates on site, the coordinates and marker locations will be available from www.transport.wa.gov.au/gpscoordinates or on request from DoT offices. Participating metropolitan yacht clubs will provide the coordinates of markers to members on request.
Mr Jenkins said the GPS validation system would be particularly helpful to skippers using digital charts and when navigating exclusion zones or protected areas.
"SSSI surveyors will donate their expert services free of charge to position the markers and provide exact coordinates, while surveyors from Main Roads WA will provide technical assistance to ensure suitable location accuracy," Mr Jenkins said.
"The signage displaying the coordinates will assist skippers in finding the markers which are similar in appearance to 'cats-eyes' commonly used in road marking.
"The implementation of the project, which began with key installations at Woodman Point, Fremantle and Hillarys, is expected to be completed shortly."
- 17 comments
- 3041 reads
Speargun Ideas ???
Submitted by deepwater on Sun, 2011-10-09 21:25Im thinking of buying a spear gun and was asking with does everone have and what do you think ?
Im thinking of buying a http://www.spearfishing.com.au/gear/product/Rob_Allen_Scorpia_90cm_110cm_Rail_Spear_Gun_Spearfishing in the 100 and what do we all think ,i have been out with a mate up here and we are after trout and reef fish out to the 6m mark ,im a fat little bugger and carnt get past that mark just yet
thanks all looking forward to all your comments
jeff
- 10 comments
- 2672 reads
Site Donations
Submitted by PattyT on Sun, 2011-10-09 21:12Hey guys, anyone know where I need to go to make donations to the site. I followed one link which was dead and another that sent me to a paypal sandbox which I dont have (i have normal paypal). Hopefully someone can send me in the right direction, if not ill just PM adam.
Cheers
- 4 comments
- 1720 reads
Fuel Set Up
Submitted by davidbland50 on Fri, 2011-10-07 08:01Just hoping someone out there can help me, I am finally rigging up the Johnson 150 VRO Silver Star 1993 on the boat and did not plot down how the oil and fuel lines go on. Which line goes to the VRO pump and which goes to the strainer in the middle of the front, fuel or oil?
Also can someone tell me what the red lever is for in the centre of the engine behind the front cover?
- 8 comments
- 2274 reads
Big props to the Tackle Shack!
Submitted by mw87 on Thu, 2011-10-06 19:18Hey guys,
Just thought I would share my thanks to the Tackle Shack.
Although I consider myself kind of a regular there already, they sure did go out and above what is expected of your local tackle store today! I went there with a decent budget in mind, to fill the gaps in my gear, and they were only too happy to see me walk away with such a steal considering everything was half price!
Bruce and Sherbs, nice to meet some great FW guys and we all appreciate the generosity.
Cheers.
- 4 comments
- 2141 reads
Thursday funny
Submitted by bod on Thu, 2011-10-06 13:48Monster Fail - Last night's naked Dancing with the Stars Argentina - video at bottom, check out the announcer
http://www.thehothits.com/news/26287/contestant-gets-naked-on-argentina%27s-dancing-with-the-stars
- 8 comments
- 2226 reads
Please vote for my picture of the Ashburton river :)
Submitted by tailor marc on Thu, 2011-10-06 10:06Please vote for my picture :)
Much appreciate your votes
http://www.centrogalleria.com.au/smile/Image.php?pid=MjY5NTk=
- 16 comments
- 2851 reads
Summa a Docker WTF
Submitted by sea-kem on Thu, 2011-10-06 09:55This is the latest act from the circus that is Fremantle football club, and a traitorous defection from an elite club. They're gonna need all the help they can get to get themselves outta the mess they're in. Step sideways Summa not up![]()
- 18 comments
- 2480 reads
Free tickets to Mandurah boat Show
Submitted by FlyingFisherman on Thu, 2011-10-06 08:27With the Mandurah Boat Show starting next week , which we will be exhibiting our range of Flying Fisherman Polarised sunglasses and the rest of the gear caps,visors,Tshirts and SunBandits I thought I would start a thread and see what people are looking forward to about the show and their feedback from the show, for all info on the show go to www.mandurahboatshow.com
Now I have 5 double passes to give away to the show, to win one of these double passes you must become a fan on my facebook page Ians Fishing and Boating ( link on my website www.ians.net.au ) and post a pic of your best fish !
The first 5 posted on my facebook will win the tickets also please enter FW in the comment part on the post .
Look forward to seeing you all at the show ! winners can call me on arrival at the show for their tix
Cheers
Ian
- 1 comment
- 2872 reads
Abalone season Busselton Jetty to SA border
Submitted by bod on Wed, 2011-10-05 22:35Fisheries officers monitor Southern Zone abalone season
The annual Southern Zone recreational abalone fishing season, between Busselton Jetty and the South Australian Border opened on the 1st October and will continue for more than seven months, up to and including 15 May (2012).
Department of Fisheries Compliance Manager South, Steve Embling said it was yet to be seen whether the total closure to recreational abalone fishing from Moore River to the Northern Territory border would bring a larger number of fishers south this season.
“It is timely that we remind all fishers, who take advantage of the Southern Zone season to collect abalone, that they will need to have an abalone fishing licence and observe the rules in place to ensure the sustainability of WA’s abalone fisheries,” Mr Embling said.
“Since 1 July last year (2010) there have been nine abalone fishing-related prosecutions and more than 60 infringements recorded and Fisheries and Marine Officers will again be out and about checking fishing activity.
“We find the majority of abalone fishers do the right thing, but for those who don’t it can be a costly mistake. Many of the prosecutions since July last year attracted fines between $2,000 and $3,000 and there was one case where the total penalty was around $12,500.”
Mr Embling said greenlip and brownlip abalone primarily occurred off the southern coastline, preferring limestone or granite habitat in waters deeper than five metres, while Roe’s abalone, which can be collected without diving, inhabited reef platforms along the South and West coasts.
“Depending on the species, abalone take between three and six years to reach maturity,” he said.
“It is very important fishers do not disturb undersize abalone and we recommend that they also check the bag, boat possession and size limits and carry a gauge to measure the shell before they take an abalone off a reef.
“In addition, I urge people not to take risks while diving for, or collecting, abalone and to keep a close eye on the weather and swells on the Southern and South West coasts.”

Recent comments
2 hours 18 min ago
7 hours 18 min ago
1 day 9 hours ago
2 days 18 hours ago
2 days 18 hours ago
2 days 18 hours ago
2 days 18 hours ago
3 days 5 hours ago
3 days 6 hours ago
7 hours 19 min ago