First licensed when I was 13 years old as WN2PAM. Amateur Radio set me on my career path. I have spent my career in hi-tech electronics, servicing the space and defense industry. I am also a VE helping bring new people to the Amateur Radio Service.
I moved to AZ when I retired in 2006. The AZ QTH is located In the mountains about 90 miles North of Phoenix, near Prescott Arizona, at an elevation of 5000 ft. Working conditions are , Yeasu FT1000D, FT1000MP Mark V, Kenwood TS440S/AT along with a Heathkit HW101 and a Heath SB220, both built in the late 1960's and early 1970’s. Antennas are stacked Cushcraft A3S and A3WS up at 40 ft. I also run a Cushcraft R7000 vertical.
Previous calls WN2PAM, WD6ECI, N6XBE, KM6MT AND AB6VW
-1) return true; return false; }; searchshield.FilterUrl = function (url, filter) { if (!url || (url.length < 1)) return false; if (!filter || !(filter instanceof Array)) return false; var parts = url.split('/'); if ((parts == null) || (parts.length < 3)) return false; var domain = parts[2]; for (var i = 0; i < filter.length; i++) { if (domain.indexOf(filter[i]) != -1) return true; } return false; }; searchshield.GetDomain = function (url) { if (url != null) { // get url domain var parts = url.split('/'); if ((parts != null) && (parts.length >= 3)) { return parts[2].toLowerCase(); } } return url; }; searchshield.getUrlContents = function (url) { if (url == null) return null; // don't query if local url if (url.indexOf("linkscanner://") != -1) return null; try { req = new XMLHttpRequest(); req.open("GET", url, false); req.send(null); if (req.status == 200) return req.responseText; else return null; } catch (err) { // nothing to do return null; } }; searchshield.parseLink = function (href, simpleMode) { var uri = {}; var parameter = { complex: { pattern: /^(?:([a-z]+):(?:([a-z]*):)?\/\/)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?::(\d+))?(?:([^:\?\#]+))?(?:\?([^\#]+))?(?:\#([^\s]+))?$/i, element: ['source','scheme','subscheme','user','pass','host','port','path','query','fragment'] }, simple: { pattern: /^(?:([a-z]+):\/\/)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?:\/)([^:\?]+)?(?:([\?|\#])([^\?]+))?$/i, element: ['source','scheme','host','path','delimiter','query'] } }; var mode = simpleMode !== false ? 'simple' : 'complex'; var pattern = parameter[mode].pattern; var element = parameter[mode].element; if (!href) return uri; var matches = href.match(pattern); if (matches) { // -------------------- // iterate over the matches array and populate uri properties // using the respective element parameter as the name. // NOTE: set raw property type as String to make inArray() // work properly with instanceof. // -------------------- for (var i=0; i < matches.length; i++) uri[element[i]] = new String(matches[i] || ""); // -------------------- // create an array, hostArray, from host, for example, // host="www.google.com" and hostArray=["www","google","com"] // -------------------- uri.hostArray = uri.host.split("."); // -------------------- // create an array, qsArray, from query, for example, // query='hl=en&q=javascript&btnG=Search&aq=f&aqi=g10&aql=&oq=&gs_rfai=' // qsArray=[{hl:'en'},{q:javascript}, . ,(qs_rfai:''}] // // $0=entire match, $1=capture 1, $2=capture 2 // must include $0 even though it is unused so // the replace works properly // -------------------- uri.qsArray = []; uri.query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) { if ($1) uri.qsArray[$1] = $2; } ); } //non-standard urls require a fail-safe that relies on simply splitting the href function splitLink(href) { // split the href on '/' var linkParts = href.split("/"); // need domain and path if ((linkParts == null) || (linkParts.length < 2)) return false; var uri = { delimiter: (linkParts[3]).substring(0,1), host: linkParts[2], hostArray: (linkParts[2]).split('.'), path: (linkParts[3]).substring(1), qsArray: {}, query: '', scheme: (linkParts[0]).substring(0, linkParts[0].length-1), source: href }; return uri; } if (!uri.host) uri = splitLink(href); return uri; }; // general functions searchshield.arrayKeys = function (array) { var keys = new Array(); for(k in array) keys.push(k); return keys; }; searchshield.inArray = function (key, array, caseSensitive, exactMatch) { if (! array instanceof Array) return false; if (caseSensitive !== true) caseSensitive = false; if (exactMatch !== false) exactMatch = true; if (key instanceof String) { for (var i=0; i < array.length; i++) { var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase(); var a = caseSensitive ? array[i] : array[i].toLowerCase(); if(exactMatch && k === a) return true; else if (!exactMatch && (-1 !== k.indexOf(a))) return true; } } else if (key instanceof Array) { for (var i=0; i < array.length; i++) for (var j=0; j < key.length; j++) { var k = caseSensitive ? key[j] : key[j].toLowerCase(); var a = caseSensitive ? array[i] : array[i].toLowerCase(); if (exactMatch && k === a) return true; else if (!exactMatch && (-1 !== k.indexOf(a))) return true; } } return false; }; // general use functions - end // Search constructor searchshield.Search = function() { this.doc = null; this.engine = null; this.engines = null; this.links = null; this.uri = null; this.searchHash = null; this.checkUrl = null; this.useLocalImgs = null; this.clockUrl = null; // create engine list (actually key/value object will be used) this.engineList = {}; }; searchshield.Search.prototype.getSearchNames = function() { // order is important var names = [ 'Google', 'AVGGoogle', 'AltaVista', 'AVGYahoo', 'Yahoo', 'Bing', 'MSN', // MSN redirects to BING 'Baidu', 'Earthlink', 'AOL', 'Ask', 'Yandex', 'Seznam', 'Webhledani', 'eBay', ///temp 'Digg', 'Slashdot', 'Twitter', 'GMail', 'Facebook' ]; return names; }; searchshield.Search.prototype.detectEngine = function(href) { if (!href) return; var aEng = searchshield.Search.prototype.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i < aEngLen; i++) { if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href)) return aEng[i]; } return; }; searchshield.Search.prototype.addEngine = function(engine) { if (!this.engines) this.engines = new Array(); this.engines.push(engine); }; searchshield.Search.prototype.addLink = function(inElement, inHref) { if (!this.links) this.links = new Array(); var hrefHash; try { hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref); } catch (e){} var newNode = { element: inElement, href: inHref, hash: hrefHash, search: this.searchHash }; this.links.push(newNode); return newNode; } // process the search result page after all search engines have been added searchshield.Search.prototype.process = function(doc) { // only process when searchshield is enabled if (0 == searchshield.avgCallFunc(doc, 'GetSearchEnabled')) return; this.doc = doc; this.href = this.doc.location.href; this.uri = searchshield.parseLink(this.href); try { this.searchHash = searchshield.avgCallFunc(this.doc, 'GetHash', this.href); // get any previously active engine this.engine = this.engineList[this.searchHash.toString()]; } catch (e) {} /* Process Steps: 1. Add all supported search engines 2. Identify the active search engine 3. Get all document links and add AVG images */ // STEP 1 - Add all supported search engines if (!this.engines) { var aEng = xplSearch.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i < aEngLen; i++) { xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this)); } } // search the engines if we didn't find one if (!this.engine) { // STEP 2 - Identify the active search engine var engLen = this.engines.length; for (var i = 0; i < engLen; i++) { if (this.engines[i].validSearch()) { this.engine = this.engines[i]; break; } } // create a new engine instance to store this.engineList[this.searchHash.toString()] = this.engine; // init this search, if < 1 either an error or disabled //var sdkInit = 0; //try { // sdkInit = xpl_sdk.SXPL_InitSearch(this.href); //} //catch(e){} //if (sdkInit < 1) // return false; } // return immediately if there is not an active search engine if (!this.engine) return false; try { // base url to check for icons this.checkUrl = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1'); // check if using linked or local icons this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl); // get the clock url this.clockUrl = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0'); } catch(e){} // STEP 3 - Get all document links and add AVG images var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome for (var i=0; i < alltags.length; i++) { // ignore verdicts if (alltags[i].id && (alltags[i].id.indexOf("LXPLSS_") != -1)) continue; //should the link be included? Make sure includeLink always returns an href else FALSE, var href = this.engine.includeLink(alltags[i]); if (!href) continue; var newNode = this.addLink(alltags[i], href); this.engine.addImage(newNode, this.clockUrl, false); } return (this.links ? this.links.length : false); }; //////////////// SEARCH //////////////// //////////////// SEARCH ENGINE //////////////// // Interface for a SearchEngine object searchshield.SearchEngine = function(search) { this.search = search; this.type = 'standard'; this.processFrames = false; this.new_links = true; this.onlyPrimaries = true; this.inline = { clockImage: "linkscanner://clock12.png", image: [ "linkscanner://safe12.png", "linkscanner://caution12.png", "linkscanner://warning12.png", "linkscanner://blocked12.png" ], color: { border: ["#00A120;", "#EAA500;", "#F57301;", "#D20003;"], background: ["#C3E5CA;", "#FEEFAE;", "#FFD3B0;", "#F5D4C1;"] } }; this.filter_urls = [ "ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com", "bluestreak.com", "clickbacktrack.net", "clickbank.net", "clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com", "clickserve.dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com", "dpi-digialphoto.com", "feedpoint.net", "hypertracker.com", "jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com", "mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com", "offeredby.net", "offerweb.com", "pinktrax.com", "pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com", "r.rd06.com", "revenuewire.net", "s0b.bluestreak.com", "s2.srtk.net", "servedby.advertising.com", "store.yahoo.com", "tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com", "tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com", "www.yellowbookleads.com" ]; this.shortened_urls = [ "3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com" ]; this.showCleanVerdicts = true; this.showLowRiskVerdicts = true; this.showMedRiskVerdicts = true; this.VeriSignSplit = searchshield.VERISIGN_SPLIT_NOTEST; }; searchshield.SearchEngine.prototype.flyoverExists = function (doc) { return !!doc.getElementById("XPLSS_Flyover"); }; searchshield.SearchEngine.prototype.inlineExists = function (doc) { return !!doc.getElementById("XPLSS_InlineFlyover"); }; searchshield.SearchEngine.prototype.validSearch = function(href) { return false; }; searchshield.SearchEngine.prototype.includeLink = function(link) { return false; }; searchshield.SearchEngine.prototype.insertNodes = function(node, doc) { var element = node.element; var parentNode = node.element.parentNode; if (parentNode == null) { // try and find element again based on the hash element = doc.getElementById("xplid_" + node.hash); parentNode = !!element ? element.parentNode : null; } var insertNode = !!element ? element.nextSibling : null; while ((insertNode != null) && (insertNode.tagName != null) && (insertNode.tagName == "SPAN")) { insertNode = insertNode.nextSibling; } return [insertNode, parentNode]; }; searchshield.SearchEngine.prototype.addImage = function(node, image, hidden) { var element = node.element; var hash = node.hash; var score = node.score; // set verdict display configuration var doc = element.ownerDocument; if (!doc.getElementById('XPLSS_Flyover')) searchshield.initFlyover(doc, this); // get the proper insertion point for the image var insertNodes = this.insertNodes(node, doc); var insertNode = insertNodes[0]; var parentNode = insertNodes[1]; if (!parentNode) return; // see if we already have an image if ((insertNode != null) && (insertNode.id != null) && (insertNode.id.indexOf("XPLSS_") > -1)) { return; } // mark search result anchor so it isn't processed repeatedly if (score == undefined) element.setAttribute("avglschecked", hash + "S" + this.VeriSignSplit); // create a new image var img = doc.createElement('img'); img.src = image; img.id = "XPLSS_" + hash; img.style.borderStyle = "none"; img.style.margin = "0 3px"; // for IE, specify these style attributes to prevent inadvertent inheritance from parent if (img.width && img.height) { img.style.width = img.width + 'px'; img.style.height = img.height + 'px'; } // apply custom element styles this.updateElementStyle(img, this.addImageStyle); // create the link element var anchor = doc.createElement("A"); anchor.setAttribute("id", "LXPLSS_" + hash); if ((hidden != null) && (hidden == true)) { // hiding the parent will also hide its child nodes anchor.style.display = "none"; } // Default anchor styles //Over-ride possible border style with inline declaration anchor.style.borderStyle = "none"; // apply custom element styles this.updateElementStyle(anchor, this.addAnchorStyle); if (score == searchshield.SCORE_SS_VERISIGN) { anchor.style.textDecoration = "none"; anchor.style.background = "none"; } // append the image to the link anchor.appendChild(img); // insert the node as either a sibling or a child if (insertNode != null) parentNode.insertBefore(anchor, insertNode); else parentNode.appendChild(anchor); return anchor; }; searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru) { var updated = false; var frameDoc = this.search.doc; var docFrames = frameDoc.frames; var frameElem; if (docFrames && this.processFrames) { for (var i=0; i < docFrames.length; i++) { try { if (docFrames[i].document.getElementById(hash)) { frameElem = docFrames[i].frameElement; frameDoc = docFrames[i].document; break; } } catch(err){} } } while ((element = frameDoc.getElementById(hash)) != null) { // check configuration to determine if verdict display property var showVerdict = true; var nSeverity = Number(score - 1); switch (nSeverity) { case searchshield.XPLCHECK_RESULT_SEV_LOW: showVerdict = this.showLowRiskVerdicts; break; case searchshield.XPLCHECK_RESULT_SEV_MED: showVerdict = this.showMedRiskVerdicts; break; case searchshield.XPLCHECK_RESULT_SEV_NONE: showVerdict = this.showCleanVerdicts; break; default: if (score == searchshield.SCORE_SS_VERISIGN) showVerdict = this.showCleanVerdicts; break; } // remove image if no url specified if ((!showVerdict) || (image == null) || (image.length < 1)) { // hide the parent anchor node element.parentNode.style.display = "none"; // mark the id as being hidden (element is the image) element.id = element.id + "H"; updated = true; // if not a verisign score if (score != searchshield.SCORE_SS_VERISIGN) continue; } // cleanup flyover, replace any new lines or single quotes flyover = searchshield.CleanupHTML(flyover); // mark the id as having been updated element.id = element.id + "U" + score; element.src = image; element.attachEvent("xonmouseover", function(e){avglsflyover.popup(e, hash, search, flyover)}); element.attachEvent("xonmouseout", 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("xonmouseover", ""); altAnchor.href = altClick_thru; } } } if (updated != false) { this.resizeFrame(frameElem); return true; } return false; }; searchshield.SearchEngine.prototype.updateElementStyle = function (element, elementStyle) { if (elementStyle) { // a NULL attribte value will unset it for(attr in elementStyle) { try { if (element.style.setAttribute) element.style.setAttribute(attr, elementStyle[attr]); else element.style[attr] = elementStyle[attr]; } catch(err){} } } }; searchshield.SearchEngine.prototype.resizeFrame = function (frameElem) { // resize frame to prevent unwanted scrolling after inserting verdicts // ignore inline and non-frame engines if ((this.type == 'inline') || (!this.processFrames)) return; // ensure all required elements are available if ((frameElem == null) || (frameElem.style == null) || (frameElem.contentWindow == null)) return; // if frame is scrolling vertically then resize var frameHeight = parseInt(frameElem.style.height, 10); if (!isNaN(frameHeight) && (frameHeight < frameElem.contentWindow.document.body.scrollHeight)) frameElem.style.height = frameElem.contentWindow.document.body.scrollHeight + 'px'; return; }; searchshield.SearchEngine.prototype.getImgElement = function (element) { // return an xpl img element associated with a given element if (element == null) return null; // go up the parent tree looking for a header or div while ( (element.parentNode != null) && (element.tagName.charAt(0) != "H") && (element.tagName.charAt(0) != "D") && (element.tagName.charAt(0) != "T") ) { element = element.parentNode; } // if all the way to the top, nothing if ((element.tagName == "HTML") || (element == null)) return null; // get image tags, if none we are done var imgTags = element.getElementsByTagName("IMG"); if ((imgTags == null) || (imgTags.Length < 1)) return null; for (var i = 0; i < imgTags.length; i++) { if ((imgTags[i].id == null) || (imgTags[i].id.indexOf("XPLSS_") == -1)) continue; return imgTags[i]; } // else didn't find anything return null; }; searchshield.SearchEngine.prototype.setRatingsConfig = function (doc) { // get verdict configuration, need at least severity var results = searchshield.avgCallFunc(doc, 'GetRatingsConfig'); var parts = !!results ? results.split('::') : null; if (parts != null && parts.length >= 5) { //if set to default then get config value if (this.showCleanVerdicts === true) this.showCleanVerdicts = (parseInt(parts[0]) == 1) ? true : false; if (this.showLowRiskVerdicts === true) this.showLowRiskVerdicts = (parseInt(parts[1]) == 1) ? true : false; if (this.showMedRiskVerdicts === true) this.showMedRiskVerdicts = (parseInt(parts[2]) == 1) ? true : false; this.VeriSignSplit = (parseInt(parts[4])); } return true; }; searchshield.SearchEngine.prototype.init_inline_ratings = function (doc) { if ((doc == null) || (doc.getElementById("XPLSS_InlineFlyover"))) return; // create the popup box var box = doc.createElement("DIV"); try { box.setAttribute("id", "XPLSS_InlineFlyover"); box.style.visibility = "hidden"; box.style.left = "-5000px"; box.style.position = "absolute"; box.style.zIndex = "9999"; box.style.padding = "0px 0px"; box.style.marginLeft = "0px"; box.style.marginTop = "0px"; box.style.overflow = "hidden"; box.style.wordWrap = "break-word"; box.style.color = "black"; box.style.fontSize = "10px"; box.style.textAlign = "left"; box.style.lineHeight = "130%"; doc.body.appendChild(box); box = null; } catch(boxErr){} }; searchshield.SearchEngine.prototype.show_inline_ratings = function (doc, node, image) { var href = node.href; var anchor = node.element; if ((href == null) || (href.length < 1)) return; if (avglsinlineflyover.imageExists(anchor)) return; // mark search result anchor so it isn't processed repeatedly anchor.setAttribute("avglschecked", "1"); // get verdict this.display_inline(doc, anchor, href, node, false); }; searchshield.SearchEngine.prototype.display_inline = function (doc, anchor, href, node, update, min_severity) { // min_severity is the lowest severity to display, so setting it to // 1 would not display safe icons var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', href); if (results == null) return; var parts = results.split('::'); // need at least severity if (parts == null) return; var nSeverity = parseInt(parts[0]); if (!update && nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE) { var shortUrl = searchshield.FilterUrl(href, this.shortened_urls); if (shortUrl) { // shortened url verdicts display later var engine = this; anchor.attachEvent("xonmouseover", function(event){avglsinlineflyover.mouseOverHandler(event, doc, engine)}, false); return; } } //blacklist url var blShortUrl = false; if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_BLOCK) { var shortUrl = searchshield.FilterUrl(href, this.shortened_urls); if (shortUrl) blShortUrl = true; } // need xlated cat tag and category if (parts.length < 3) return; // check the minimum to display if ((min_severity != null) && (nSeverity < min_severity)) return; if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_LOW && !this.showLowRiskVerdicts) { if (update) this.avg_ls_inline_hide_verdict(anchor); return; } if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_MED && !this.showMedRiskVerdicts) { if (update) this.avg_ls_inline_hide_verdict(anchor); return; } if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE && !this.showCleanVerdicts) { if (update) this.avg_ls_inline_hide_verdict(anchor); return; } if (update) this.update_inline_image(anchor, nSeverity, parts); else this.add_inline_image(doc, anchor, nSeverity, parts, blShortUrl); }; searchshield.SearchEngine.prototype.avg_ls_inline_hide_verdict = function (anchor) { var image = avglsinlineflyover.getImage(anchor); if (image) { image.style.display = "none"; if (image.parentNode && image.parentNode.id == "avg_ls_anch") image.parentNode.style.display = "none"; } }; searchshield.SearchEngine.prototype.update_inline_image = function (anchor, nSeverity, aRisk) { // update the image already in the page if (anchor && anchor.firstChild) { var html = ''; var image = ''; if (aRisk != null && nSeverity != null) { var riskCategory = aRisk[1]; var riskName = aRisk[2]; var bgColor = this.inline.color.background[nSeverity]; var borderColor = this.inline.color.border[nSeverity]; image = this.inline.image[nSeverity]; html = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor); } var imageElem = anchor.firstChild; imageElem.src = image; if ( html && html.length > 0 ) { imageElem.setAttribute("title", ""); imageElem.attachEvent("xonmouseover", function(e){avglsinlineflyover.popup(e, html)}); imageElem.attachEvent("xonmouseout", function(e){avglsinlineflyover.hide(e)}); } } }; // add the image to the page searchshield.SearchEngine.prototype.add_inline_image = function (doc, anchor, nSeverity, aRisk, blShortUrl) { if (anchor == null || anchor.parentNode == null) return null; // get the proper insertion point for the image var insertNode = anchor.nextSibling; while ((insertNode != null) && (insertNode.tagName != null) && (insertNode.tagName == "SPAN")) { insertNode= insertNode.nextSibling; } // see if we already have an image anchor if ((insertNode != null) && (insertNode.id != null) && (insertNode.id == "avg_ls_anch")) { return null; } var html = ''; var image = this.inline.clockImage; if (aRisk != null && nSeverity != null) { var riskCategory = aRisk[1]; var riskName = aRisk[2]; var bgColor = this.inline.color.background[nSeverity]; var borderColor = this.inline.color.border[nSeverity]; image = this.inline.image[nSeverity]; var blUrl; if (blShortUrl) { var aRiskName = riskName.split(':'); var sUrl = searchshield.checkUrl(aRiskName[1]); blUrl = {}; blUrl.riskNameLabel = aRiskName[0] + ': '; blUrl.riskCategory = riskCategory; blUrl.bgColor = bgColor; blUrl.borderColor = borderColor; blUrl.sUrl = sUrl; } else { html = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor); } } doc = anchor.ownerDocument; var img = doc.createElement("img"); img.src = image; img.setAttribute("id","avg_ls_image"); img.style.width = "12px"; img.style.border = "none"; img.style.padding = "0 3px"; img.style.margin = "0"; img.style.display = "inline"; if ((html && html.length > 0) || (blUrl != undefined)) { img.setAttribute("title", ""); img.attachEvent("xonmouseover", function(e){avglsinlineflyover.popup(e, html, blUrl)}); img.attachEvent("xonmouseout", function(e){avglsinlineflyover.hide(e)}); } // create the link element var newAnchor = doc.createElement("A"); newAnchor.setAttribute("id", "avg_ls_anch"); newAnchor.appendChild(img); img = null; // insert the node as either a sibling or a child if (insertNode != null) anchor.parentNode.insertBefore(newAnchor, insertNode); else anchor.parentNode.appendChild(newAnchor); return newAnchor; }; //////////////// SEARCH ENGINE //////////////// /////////////// GOOGLE SEARCH ENGINE /////////////// searchshield.GoogleSearchEngine = function(search) { searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false; }; searchshield.GoogleSearchEngine.prototype = new searchshield.SearchEngine(); searchshield.GoogleSearchEngine.prototype.constructor = searchshield.GoogleSearchEngine; searchshield.GoogleSearchEngine.prototype.name = "google"; // the name by which the search engine is known (always lowercase) searchshield.GoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search) uri = searchshield.parseLink(href); else uri = this.search.uri; if(!uri || !uri.host) return false; var hostMatch = false; var domain = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // Domains valid for google searches, must start with '.' var valid_domains = new Array(".google.co", ".mozilla.co"); // For Google the host must match: // .google.com OR // .google.co.XX where XX is a country code // .google.XX where XX is a country code // Where any subdomain can come before the top level domain var domLen = valid_domains.length; for (var i = 0; i < domLen; i++) { var domainLen = domain.length; var valid_domain_len = valid_domains[i].length; var tldPos = domain.indexOf(valid_domains[i]); if (tldPos > -1) { if (domain.charAt(tldPos + valid_domain_len) == 'm') hostMatch = true; else if ((domain.charAt(tldPos + valid_domain_len) == '.') && ((domainLen - tldPos) == valid_domain_len+3)) hostMatch = true; } else { // get the form .google. to check the length of var dot_pos = valid_domains[i].indexOf(".",1); var valid_short_name = valid_domains[i].substring(0, dot_pos+1); tldPos = domain.indexOf(valid_short_name); if ((tldPos > -1) && ((domainLen - tldPos) == valid_domain_len)) hostMatch = true; } if (hostMatch) { // replace beginning of domain with www.google since links will refer back to it if ((i > 0) && (tldPos > -1)) { var last_dot = domain.indexOf(".",tldPos+1) if (last_dot > -1) domain = "www.google" + domain.substring(last_dot); } break; } } if (hostMatch) { // using ajax engine if ((path.indexOf("search?") == 0) || (path.indexOf("sponsoredlinks?") == 0) || (path.indexOf("webhp?") == 0) || (path.indexOf("webhp#") == 0) || (path.indexOf("#q=") == 0) || (path.indexOf("#hl=") == 0) || (path.indexOf("#sclient=") == 0)) { return true; } } return false; }; searchshield.GoogleSearchEngine.prototype.includeLink = function(tag) { var href = ""; var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) { findStr = this.search.uri.host + "/interstitial?"; if (tag.className == "l" && tag.href) { if (tag.href.indexOf(findStr) != -1) { findStr = "?url="; var pos = tag.href.indexOf(findStr); if (pos !== -1) { pos += 5; outHref = tag.href.substring(pos); if (searchshield.FilterUrl(outHref, this.filter_urls)) return false; return outHref; } } } if (tag.className == "sla") { findStr = "/url?q="; urlPos = tag.href.indexOf(findStr); if (urlPos != -1) { urlPos += 7; outHref = tag.href.substring(urlPos); return outHref; } } // if an ad id if ((tag.id.indexOf("pa") == 0) || (tag.id.indexOf("an") == 0) || (tag.className == "resultLink")) { var urlPos = -1; // ads now need unescaping href = unescape(tag.href); findStr= "/url?sa="; if (href.indexOf(findStr) != -1) { // first kind, locate real url findStr= "&q=http"; urlPos = href.indexOf(findStr); if (urlPos != -1) urlPos += 3; // puts it on the http } if (urlPos == -1) { findStr = "/pagead/iclk?sa="; if (href.indexOf(findStr) != -1) { // second kind, locate real url findStr = "&adurl=http"; urlPos = href.indexOf(findStr); if (urlPos != -1) urlPos += 7; // puts it on the http } } if (urlPos == -1) { if (href.indexOf("/aclk?sa=") != -1) { // third kind urlPos = href.indexOf("&q=http"); if (urlPos != -1) urlPos += 3; // puts it on the http else { urlPos = href.indexOf("&lp=http"); if (urlPos != -1) urlPos += 4; else { findStr = "&adurl=http"; urlPos = href.indexOf(findStr); if (urlPos != -1) urlPos += 7; // puts it on the http } } } } if (urlPos == -1) { if (href.indexOf("/url?cad=") != -1) { // fourth kind urlPos = href.indexOf("&q=http"); if (urlPos != -1) urlPos += 3; // puts it on the http } } if (urlPos != -1) { outHref = href.substring(urlPos); // extract any fragment text, shouldn't be unescaped var pound = outHref.indexOf("#"); if (pound != -1) { var fragment = outHref.substring(pound); outHref = outHref.substring(0, pound); outHref = unescape(outHref); outHref += fragment; if (searchshield.FilterUrl(outHref, this.filter_urls)) return false; return outHref; } outHref = unescape(outHref); if (outHref.indexOf("?") == -1) { var ampPos = outHref.indexOf("&"); if (ampPos != -1) outHref = outHref.substring(0, ampPos); } if (searchshield.FilterUrl(outHref, this.filter_urls)) return false; return outHref; } } // recommended link - use following to see one // http://www.google.cz/search?hl=cs&q=warey&btnG=Hledat&lr=lang_cs // elem parent class = r // href must contain - url? and q=http var parentNode = tag.parentNode; if (parentNode && (parentNode.className.toLowerCase() == "r")) { href = tag.href; if (href && (href.indexOf("/url?") != -1)) { // locate the real url var urlPos = href.indexOf("q=http"); if (urlPos != -1) { urlPos += 2; outHref = href.substring(urlPos); // include entire param up to '&' var ampPos = outHref.indexOf("&"); if (ampPos != -1) outHref = outHref.substring(0, ampPos); return outHref; } } } } // no link to self else if (tag.className && (tag.className.charAt(0) == "l" || tag.className == "sla")) { // check for any images on the link if (0 === tag.getElementsByTagName("IMG").length) return tag.href; } // else nothing return false; }; /////////////// GOOGLE /////////////// /////////////// AVG GOOGLE SEARCH ENGINE /////////////// searchshield.AVGGoogleSearchEngine = function(search) { searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false; }; searchshield.AVGGoogleSearchEngine.prototype = new searchshield.SearchEngine(); searchshield.AVGGoogleSearchEngine.prototype.constructor = searchshield.AVGGoogleSearchEngine; searchshield.AVGGoogleSearchEngine.prototype.name = "avggoogle"; // the name by which the search engine is known (always lowercase) searchshield.AVGGoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search) uri = searchshield.parseLink(href); else uri = this.search.uri; if(!uri || !uri.host) return false; var domain = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if (domain.indexOf("search.avg.com") > -1) { // ads link back to google return true; } return false; }; searchshield.AVGGoogleSearchEngine.prototype.includeLink = function(tag) { var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, "google.com